OCMD - Seltsamer Fehler?

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,
    um Befehle mit Parametern zu erzeugen (Bsp.: /pn [ID] [NACHRICHT]) benutze ich OCMD. Ich habe bereits einige Befehle mit OCMD erstellt, alle funktionieren soweit einwandfrei, außer die Befehle /kick [ID] [GRUND] und /ban [ID] [GRUND]...


    Nachfolgend zunächst die Definition des Befehls /kick [ID] [GRUND]:


    Spielername(playerid) ist hier eine von mir erstellte Funktion (stock), der einfach nur den Namen des Spielers mit der angegebenen ID zurückgibt.


    Den Ban-Befehl (/ban [ID] [GRUND]) habe ich genau so erstellt, nur dass ich in der Zeile mit //MARKIERT statt Kick(playerid) Ban(playerid) geschrieben habe...


    Nun habe ich folgendes Problem: Führe ich InGame einen der Befehle aus (/kick oder /ban), schreibt der Server in den Chat zunächst die Nachricht "[KICK] %s wurde von %s gekickt (Grund: %s)" (Dabei wird %s eben durch die Werte ersetzt), und nachfolgend "SERVER: Unknown Command". Warum?

    Programmierung: C/C++, Java, BASIC, SQL, HTML, CSS, JavaScript, PHP


    Einfach eine mega-große Schrift, die meine obige Nachricht nicht von meiner Signatur unterscheiden lässt, weil meine Signatur einfach nur gigantisch ist - Aber das ist mir egal...

  • Ich weiss nicht ob es daran lag, aber probier es mal mit einen return 1;



    ocmd:kick(playerid, params[1024])
    {
    if(Player[playerid][IsAdmin] == 1 || Player[playerid][IsAdmin] == 2)
    {
    new PlayerID;
    new Reason[1024];
    new string[2048];
    if(sscanf(params, "us", PlayerID, Reason))
    {
    SendClientMessage(playerid, COLOR_WARNING, "/kick [ID] [GRUND]");
    }
    else
    {
    if(IsPlayerConnected(PlayerID))
    {
    format(string, sizeof(string), "[KICK] %s wurde von %s gekickt (Grund: %s)", Spielername(PlayerID), Spielername(playerid), Reason);
    SendClientMessageToAll(COLOR_WARNING, string);
    //SendClientMessage(PlayerID, COLOR_WARNING, string);
    SavePlayerProfile(PlayerID);
    Kick(PlayerID); // MARKIERT
    }
    else
    {
    SendClientMessage(playerid, COLOR_WARNING, "Der Spieler ist nicht mehr online!");
    }
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_WARNING, "Du besitzt nicht die erforderlichen Rechte um den Befehl auszuführen.");
    }
    return 1;
    }

  • Hatte ich aus einem Video-Tutorial :P Dort meinte der Knaller immer da müsste 1024 rein, einfach darum ;)
    Kam mir aber auch immer seltsam vor, da ich nebenbei C++ programmiere und das so auch nicht kenne, dass man bei einem Array die Länge als Parameter vorgibt...


    Hat sich aber leider nichts getan... Aber mir ist Folgendes aufgefallen: Wenn ich den Befehl InGame ausführe wird nebenbei noch in scriptfiles eine Datei mit dem Namen "[GekickterSpieler].porfile.part" erstellt, obwohl ich die Profil-Daten eines Spielers nur in .profile - Dateien speichere (via Dini). Im obigen Codebeispiel werden die Daten mit der selbstgeschriebenen Funktion SavePlayerProfile(playerid) gespeichert. Hier mal dessen Inhalt:


    Ich habe aber noch nie gesehen, dass der Server automatisch eine .part - Datei erstellt...

    Programmierung: C/C++, Java, BASIC, SQL, HTML, CSS, JavaScript, PHP


    Einfach eine mega-große Schrift, die meine obige Nachricht nicht von meiner Signatur unterscheiden lässt, weil meine Signatur einfach nur gigantisch ist - Aber das ist mir egal...

  • Zitat

    Ich habe aber noch nie gesehen, dass der Server automatisch eine .part - Datei erstellt...

    .part Dateien sind unvollständig. Das ist so als wenn du dir gerade etwas Downloadest, dann hast du z.B. nicht die Datei "Anti-Vira.exe" sondern "Anti-Vira.exe.part" ...

  • Ich weiß jetzt zumindest woran es liegt, kann den Fehler aber nicht beheben: Zeitlich gesehen wird, wenn ein Admin den /kick Befehl (analog dazu den /ban Befehl) ausführt zuerst der Spieler gekickt/gebannt und erst dann wird versucht das Profil über die SavePlayerProfile() - Funktion zu speichern. Daher auch die part-Datei: Es wird versucht das Profil zu speichern, während der Spieler vom Server disconnected. Hinterher fehlen zwar keine Daten, der File-Handle kann aber anscheinend trotzdem nicht abgegeben werden.


    Zudem habe ich noch folgendes Problem: Dem gekickten Spieler soll der Grund angezeigt werden. Dies habe ich in den Funktionen sogar doppelt umgesetzt: Einmal durch SendClientMessageToAll() und einmal sofort danach durch SendClientMessage(). Der gekickte Spieler bekommt den Grund aber trotzdem nicht angezeigt...

    Programmierung: C/C++, Java, BASIC, SQL, HTML, CSS, JavaScript, PHP


    Einfach eine mega-große Schrift, die meine obige Nachricht nicht von meiner Signatur unterscheiden lässt, weil meine Signatur einfach nur gigantisch ist - Aber das ist mir egal...