Befehl existiert 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
  • Hi, bekomme den Fehler dass der Befehl nicht existiert


    ocmd:f(playerid,params[])
    {
    new name[MAX_PLAYER_NAME], text[128];
    if(isPlayerInFrakt(playerid,0))return SendClientMessage(playerid,ROT,"Du bist in keiner Fraktion!");
    if(sscanf(params,"s[128]",text))return SendClientMessage(playerid,ROT,"Befehl: /f 'Nachricht'");
    new fID = sInfo[playerid][fraktion];
    GetPlayerName(playerid,name,sizeof(name));
    if(isPlayerInFrakt(playerid,1))
    {
    format(text,sizeof(text),"**((%s %s: %s ))**",LSPDRangName[sInfo[playerid][frang]-1],name,text);
    }
    else if(isPlayerInFrakt(playerid,2))
    {
    format(text,sizeof(text),"**((%s %s: %s ))**",MedicRangName[sInfo[playerid][frang]-1],name,text);
    }
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue;
    if(!isPlayerInFrakt(i,fID))continue;
    SendClientMessage(i,BLAU,text);
    }
    return 1;
    }
    Liegt dass dran dass ich die Schleife an der falschen Stelle habe?

  • Wenn du Rang 0 bist würde dieser Fehler auftreten, da du -1 machst. An sich ja nicht falsch, aber dann musst du abfragen, ob der Spieler einen Rang größer als 0 hat. Ansonsten könnte es noch sein, dass der Rang zu groß ist. Prüfe das mal, lass dir den Wert ggf mal ausgeben.

  • Jetzt gehts, Fehler war ich arbeite mit 6 Rängen und hatte oben erst 2 Rangnamen hinzugefügt
    Hab aber trotzdem die Abfrage noch eingefügt.


    else if(isPlayerInFrakt(playerid,2)) habe ich hier was falsch gemacht?
    Die Rangnamen werden jetzt nur in Fraktion 1 angezeigt, bei Fraktion 2 wird nur der eingegebene Text geschrieben.
    Genauso wenn ich mir Rang 0 gebe wird auch nur der eingegebene Text geschrieben, ohne Rangname

  • ocmd:f(playerid,params[])
    {
    new name[MAX_PLAYER_NAME], text[128];
    if(isPlayerInFrakt(playerid,0))return SendClientMessage(playerid,ROT,"Du bist in keiner Fraktion!");
    if(sscanf(params,"s[128]",text))return SendClientMessage(playerid,ROT,"Befehl: /f 'Nachricht'");
    new fID = sInfo[playerid][fraktion];
    GetPlayerName(playerid,name,sizeof(name));
    if(isPlayerInFrakt(playerid,1))
    if(sInfo[playerid][frang] > 0)

    {
    format(text,sizeof(text),"**((%s %s: %s ))**",LSPDRangName[sInfo[playerid][frang]-1],name,text);
    }
    else if(isPlayerInFrakt(playerid,2))
    {
    format(text,sizeof(text),"**((%s %s: %s ))**",MedicRangName[sInfo[playerid][frang]-1],name,text);
    }
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue;
    if(!isPlayerInFrakt(i,fID))continue;
    SendClientMessage(i,BLAU,text);
    }
    return 1;
    }


    So, Problem ist jetzt wenn ich in Fraktion 1 mit /f hallo schreibe steht das richtig da: **((Rangname Kontrax: Hallo))**
    Bei Fraktion 2 siehts so aus im Chat: Hallo

  • bau das ganze doch mal um, du brauchst ja in dem Fall nicht jede Fraktion einzelnd abfragen



    code by Stormi
    ocmd:f(playerid,params[])
    {
    if(isPlayerInFrak(playerid,0)) return 1;
    new string[256];
    if(sscanf(params,"s[256]",string)) return SendClientMessage(playerid,RED,"Benutze /f [Nachricht] ");
    new fID = sInfo[playerid][fraktion];
    format(string,sizeof(string)," *Fraktion:[%s]; Rang:[%i];%s;(%s: %s)*",fInfo[fID][f_name], sInfo[playerid][rang],GetPlayerRangName(playerid),getPlayerName(playerid),string);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue;
    if(!isPlayerInFrak(i,fID))continue;
    SendClientMessage(i,CL_HBLUE,string);
    }
    return 1;
    }

    definierung der Rangnamen

    stock GetPlayerRangName(playerid)
    {
    new rName[32]="Co Leader des SFPD";
    switch(sInfo[playerid][fraktion])
    {
    case 1:
    {
    switch(sInfo[playerid][rang])
    {
    case 0: rName="Praktikant des LSPD";
    case 1: rName="Azubi des LSPD";
    case 2: rName="Polizist I";
    case 3: rName="Polizist II";
    case 4: rName="Polizist III";
    case 5: rName="Co Leader des LSPD";
    case 6: rName="Leader des LSPD";
    }
    }
    case 2:
    {
    switch(sInfo[playerid][rang])
    {
    case 0: rName="Praktikant des SFPD";
    case 1: rName="Azubi des SFPD";
    case 2: rName="Polizist I";
    case 3: rName="Polizist II";
    case 4: rName="Polizist III";
    case 5: rName="Co Leader des SFPD";
    case 6: rName="Leader des SFPD";
    }
    }



    mit den cases arbeitest du einfach alle fraktionen ab, so kannst du diese überall im Script verwenden :)

  • Du hast einfach nur die if-Abfragen vertauscht gehabt.
    So passt es:
    ocmd:f(playerid,params[])
    {
    new name[MAX_PLAYER_NAME], text[128];
    if(isPlayerInFrakt(playerid,0))return SendClientMessage(playerid,ROT,"Du bist in keiner Fraktion!");
    if(sscanf(params,"s[128]",text))return SendClientMessage(playerid,ROT,"Befehl: /f 'Nachricht'");
    new fID = sInfo[playerid][fraktion];
    GetPlayerName(playerid,name,sizeof(name));
    if(sInfo[playerid][frang] <= 0) return SendClientMessage(playerid,ROT,"Du hast keinen Rang!");
    if(isPlayerInFrakt(playerid,1))
    {
    format(text,sizeof(text),"**((%s %s: %s ))**",LSPDRangName[sInfo[playerid][frang]-1],name,text);
    }
    else if(isPlayerInFrakt(playerid,2))
    {
    format(text,sizeof(text),"**((%s %s: %s ))**",MedicRangName[sInfo[playerid][frang]-1],name,text);
    }
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue;
    if(!isPlayerInFrakt(i,fID))continue;
    SendClientMessage(i,BLAU,text);
    }
    return 1;
    }

  • Ok, Danke aber hätte es mit dieser Abfrage trotzdem funktioniert?
    if(sInfo[playerid][frang] > 0)
    Oder muss man wenn man es so macht immer reinschreiben was dann passieren soll?
    Also so:
    if(sInfo[playerid][frang] > 0)
    {
    Rang größer 0
    }
    else
    {
    Rang kleiner gleich 0
    }







    und nochwas dazu, kann ich statt der Nachricht nach dem return auch einfach return 0; schreiben? Das sagt ja dass die Funktion abgebrochen wird oder?

  • Wenn du nichts dahinter schreibst (so wie du es hattest), dann wird automatisch die nächste Zeile genommen.
    Es ist also immer besser es direkt dahinter zu schreiben, oder die geschweiften Klammern zu verwenden.


    Also ist die if Abfrage dann eigentlich wirkungslos wenn nichts dahinter steht oder?


    und wenn man return 0 dahinter schreibt? Oder muss return 1 hin?






    Und ist es besser mit case zu arbeiten?
    Noch was kleines, in den Tutorials habe ich immer gesehen dass Funktionen ohne stock erstellt werden? Für was braucht man diese dann überhaupt?




    Danke schonmal! :thumbup:

  • Also ist die if Abfrage dann eigentlich wirkungslos wenn nichts dahinter steht oder?


    Richtig..ist logisch oder? :rolleyes:


    und wenn man return 0 dahinter schreibt? Oder muss return 1 hin?


    In diesem Fall egal.


    Und ist es besser mit case zu arbeiten?


    Ja :)


    Noch was kleines, in den Tutorials habe ich immer gesehen dass Funktionen ohne stock erstellt werden? Für was braucht man diese dann überhaupt?


    stock ist ein Wort für den Compiler, sobald stock vor einer Funktion oder Variable steht und diese nicht verwendet wird, wird sie vom Compiler ignoriert :)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • Hab nicht gelesen was drüber stand...


    Ich dachte er hat sowas gemeint:


    if(!IsPlayerAdmin(playerid)) { } //und das wäre nutzlos
    else {


    }


    mfg. :rolleyes:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Ich bins leider nochmal, habe das jetzt mit den Case probiert:
    GetPlayerRangName(playerid)
    {
    new rName[32]="Co Leader des SFPD";
    switch(sInfo[playerid][fraktion])
    {
    case 1:
    {
    switch(sInfo[playerid][frang])
    {
    case 1: rName="Azubi des LSPD";
    case 2: rName="Polizist I";
    case 3: rName="Polizist II";
    case 4: rName="Polizist III";
    case 5: rName="Co Leader des LSPD";
    case 6: rName="Leader des LSPD";
    }
    }
    case 2:
    {
    switch(sInfo[playerid][frang])
    {
    case 1: rName="Azubi des SFPD";
    case 2: rName="Polizist I";
    case 3: rName="Polizist II";
    case 4: rName="Polizist III";
    case 5: rName="Co Leader des SFPD";
    case 6: rName="Leader des SFPD";
    }
    }
    }
    return 1;
    }


    ocmd:f(playerid,params[])
    {
    new name[MAX_PLAYER_NAME], text[128];
    if(isPlayerInFrakt(playerid,0))return SendClientMessage(playerid,ROT,"Du bist in keiner Fraktion!");
    if(sscanf(params,"s[128]",text))return SendClientMessage(playerid,ROT,"Befehl: /f 'Nachricht'");
    new fID = sInfo[playerid][fraktion];
    GetPlayerName(playerid,name,sizeof(name));
    format(text,sizeof(text),"**((%s %s: %s ))**",GetPlayerRangName(playerid),name,text);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue;
    if(!isPlayerInFrakt(i,fID))continue;
    SendClientMessage(i,HELLBLAU,text);
    }
    return 1;
    }



    Habe aber jetzt einen komischen Fehler.
    Wenn ich mir z.b einen Rang gebe mit /giverang meineID 3


    Dann steht wenn ich als nächsten Befehl /f test schreibe in der Zeile: **((meineID 3 Kontrax: test))**



    Ich hoffe ihr könnt mir weiterhelfen, verstehe dass gerade gar nicht:D

  • Du musst dich nicht entschuldigen, dafür ist das Forum und wir ja da. :)


    In der GetPlayerRangName Funktion ganz unten:
    return 1;
    zu:
    return rName;


    Außerdem kannst du ruhig
    new rName[32]="Co Leader des SFPD";
    zu:
    new rName[32]="<Unbekannt>";
    ändern.
    Es muss nicht der längste Wert dort drin stehen.