befehle mit zcmd

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
  • Hallo


    Ich habe eine frage zu zcmd..
    Ich habe nochnicht damit gearbeitet und bin auch nicht damit vertraut es scheint mir aber einfach vorzukommen wenn ich es verstanden habe ;)
    dazu brauche ich eure hilfe :)


    Ich möchte zb einen /kick befehl machen
    doch ich habe eigentlich keinerlei vorstellung was ich jetzt in diesen befehl alles reinschreiben müsste
    dass ich den Grund eingeben muss usw..


    Mit Freundlichen Grüßen

    Mit freundlichen Grüßen
    Siepac

  • CMD:kick(playerid,params[])
    {
    if(!IstSpielerAdmin(playerid,2))return SCM(playerid,rot,"Du hast nicht den nötigen Adminrang");
    new pID, reason[64],string[128];
    if(sscanf(params,"us",pID,reason))return SendClientMessage(playerid,rot,"Benutze /kick [ID] [Grund]");
    format(string,sizeof(string),"%s wurde von %s gekickt. Grund: %s",Spielername(pID),Spielername(playerid),reason);
    SCMTA(rot,string);
    Kick(pID);
    return 1;
    }


    Erklärung kommt gleich :whistling:
    Oben kommt eben die Adminabfrage ich kenne sie ja aus deinem Script^^
    1. Wenn der der den Command ausführt nicht das Adminlevel 2 oder höher hat wird der Command abgebrochen und ihm wird ne Nachricht ausgegeben, dass er nicht den benötigten Adminrang hat
    2. Wir deklarieren 3 Variablen
    pID reflektiert den Spieler den wir kicken möchten
    reason(deutsch = Grund) steht für den Grund warum wie den Spieler kicken
    und string ist eben die allgemeine Nachricht die dann an alle geschickt wird
    3. Die sscanf Abfrage
    "us" stehen für die Parameter der Abfrage
    u = User heißt man muss eine UserID oder den Namen eines Users angeben und die
    s = ist ein string in unserem Fall der string "reason" also der grund warum wie den Spieler kicken
    und u und s wird durch die Variablen pID und reason angegeben
    Wenn man die Parameter eben nicht ordentlich "ausfüllt" wird der command unterbrochen und man bekommt die nachricht wie man den Command benutzt
    4. Wir formatieren den string mit 3 platzhaltern (3mal %s) diese stehen für den Namen vom Benutzer des Commands, der Name vom gekickten und der grund weßhalb er gekickt wird
    5. Diese Nachricht schicken wir an alle
    6. der Spieler wird gekickt


    Ich hoffe ich habs halbwegs verständlich und richtig erklärt^^
    Und ich weiß selbst nicht warum ich immer "wir" geschrieben hab :P
    Die sscanf Abfrage ist bestimmt etwas falsch erklärt damit kenn ich mich nicht ganz so aus
    Wenn ich etwas falsch/ungenau erklärt hab(und das hab ich sicherlich) dann berichtigt mich da lern ich auch noch etwas ;)


    Die stock Funktion Spielername hast du ja bereits im Script

    4 Mal editiert, zuletzt von [COE]CodeX ()

  • C:\Users\user\Desktop\Server\gamemodes\Test.pwn(305) : error 017: undefined symbol "pInfo"
    C:\Users\user\Desktop\Server\gamemodes\Test.pwn(305) : warning 215: expression has no effect
    C:\Users\user\Desktop\Server\gamemodes\Test.pwn(305) : error 001: expected token: ";", but found "]"
    C:\Users\user\Desktop\Server\gamemodes\Test.pwn(305) : error 029: invalid expression, assumed zero
    C:\Users\user\Desktop\Server\gamemodes\Test.pwn(305) : fatal error 107: too many error messages on one line


    zeile 305
    format(string,sizeof(string),"%s wurde von %s gekickt. Grund: %s",pInfo[pID][Name],pInfo[playerid][Name],reason);

    Mit freundlichen Grüßen
    Siepac

  • Erstmal das normale Grundgerüst:
    CMD:kick(playerid, params[])
    {
    return 1;
    }


    Dann sollen nur Admins den Befehl ausführen können:
    CMD:kick(playerid, params[])
    {
    if(pInfo[player][Adminlevel] < 1) return SendClientMessage(playerid, ROT, "Nö!");
    return 1;
    }


    Es geht weiter mit den Parametern, die wir vom Nutzer kriegen.
    /kick 1 Cheater - Parameter 1 ist der Nutzer, Parameter 2 der Grund. Das können wir mittels dieses Codes rausfiltern:
    CMD:kick(playerid, params[])
    {
    if(pInfo[player][Adminlevel] < 1) return SendClientMessage(playerid, ROT, "Nö!");
    new pID, grund[64]; //pID wird gekickt, grund ist eben der Grund
    if(sscanf(params, "us" pID, grund)) return SendClientMessage(playerid, ROT, "Verwende /kick <ID/Name> <Grund>");
    return 1;
    }


    Dann ist es üblich, an alle Nutzer eine Nachricht zu schicken, wer denn gekickt wurde und warum und dann kicken wir ihn:
    CMD:kick(playerid, params[])
    {
    if(pInfo[player][Adminlevel] < 1) return SendClientMessage(playerid, ROT, "Nö!");
    new pID, grund[64]; //pID wird gekickt, grund ist eben der Grund
    if(sscanf(params, "us" pID, grund)) return SendClientMessage(playerid, ROT, "Verwende /kick <ID/Name> <Grund>");
    new name1[MAX_PLAYER_NAME+1], name2[MAX_PLAYER_NAME+1], msg[128];
    GetPlayerName(playerid, name1, sizeof(name1));
    GetPlayerName(pID, name2, sizeof(name2));
    format(msg, sizeof(msg), "%s wurde von %s gekickt. Grund: %s", name2, name1, grund);
    SendClientMessageToAll(ROT, msg);
    Kick(pID);
    return 1;
    }


    Sämtliche Variablen sind so anzupassen, wie sie in deinem Skript stehen.

    Ich bin Dittis Signatur.

  • also habe es jetzt einigermaßen verstandne


    dier errors habe ich wegbekommen indem ich das hier gelöscht habe..
    ,pInfo[pID][Name],pInfo[playerid][Name],reason
    war das von bedeutung?


    #edit
    Klappt doch ;)

    Mit freundlichen Grüßen
    Siepac

  • Ja schon denn das ersetzt die Platzhalter %s mit den verschiedenen Namen und dem Grund
    (Ich hab das nur aus nem GM von mir kopiert und da war es noch drin^^)
    Schau nochmal in meinen Befehl ich habs geändert mit der Funktion Spielername die hast du ja wie ich weiß auch schon ;)