Beiträge von Kleiner Opa

    ocmd 2.1.1
    ocmd ist eine Include, mit der sich Commands um einiges einfacher scripten lassen. Statt sämtliche Commands unter OnPlayerCommandText auflisten zu müssen, kann einfach irgendwo im Script eine Funktion gescriptet werden.
    ocmd funktioniert am besten zusammen mit sscanf.


    Mit ocmd können auch große Scripts mit hunderten Commands problemlos und schnell ausgeführt werden.


    Anwendung
    Zunächst musst du die ocmd-include downloaden, in deinen include-Ordner verschieben und dann auch in deinem Script auslesen:
    #include <ocmd>


    Ein einfacher Command mit ocmd sieht in etwa so aus:
    ocmd:test(playerid,params[])
    {
    SendClientMessage(playerid,0xffffffff,"Du hast /test eingegeben");
    return 1;
    }


    Mit sscanf können auch Parameter abgefragt werden:
    ocmd:lotto(playerid,params[])
    {
    new lottoNummer;
    if(sscanf(params,"d",lottoNummer))return SendClientMessage(playerid,0xff0000ff,"Nutze /lotto [zahl]");
    printf("Spieler %d hat sich Lotto-Nummer %d gekauft",playerid,lottoNummer);
    return 1;
    }


    Profi-Funktionen

    Spoiler anzeigen
    Profifunktionen können per #define vor dem #include <ocmd> aktiviert werden.

    Spoiler anzeigen
    Mit OCMD_BEFORE_CALLBACK kann ein zusätzliches Callback aktiviert werden, mit dem z.B. überprüft werden kann, ob ein Spieler gemuted wurde - returnt dieses Callback 0, wird kein Command ausgeführt:
    #define OCMD_BEFORE_CALLBACK
    #include <ocmd>

    Spoiler anzeigen
    public BeforePlayerCommandText(playerid,cmdtext[])
    {
    if(GetPVarInt(playerid,"muted"))
    {
    SendClientMessage(playerid,0xff0000ff,"Du bist gemuted");
    return 0;
    }
    return 1;
    }

    Spoiler anzeigen
    Mit OCMD_COMMAND_LOG kann dafür gesorgt werden, dass Commands wie der Chat in der server_log.txt auftauchen:
    #define OCMD_COMMAND_LOG
    #include <ocmd>Tipp: Mit z.B. #define OCMD_COMMAND_LOG_FORMAT "[Servername] ** %s: %s" kann das Format des Logs beliebig geändert werden. Hierbei wird das erste "%s" stets durch den Spielernamen und das zweite "%s" durch den eingegebenen Command ersetzt. #define OCMD_COMMAND_LOG_FORMAT muss dabei auch stets vor dem #include <ocmd> stehen.

    Spoiler anzeigen
    Mit ocmd@ können für einen Command mehrere Namen festgelegt werden. Hierbei muss hinter dem @ zunächst die Anzahl der Namen folgen, dann ein ":" und dann die durch ein Komma getrennten Namen:ocmd@2:help,hilfe(playerid,params[])
    {
    SendClientMessage(playerid,0xffffffff,"Du hast /help oder /hilfe eingegeben");
    return 1;
    }

    Spoiler anzeigen
    ocmd@3:hallo,servus,bonjour(playerid,params[])
    {
    SendClientMessage(playerid,0xffffffff,"Du hast /hallo, /servus oder /bonjour eingegeben");
    return 1;
    }Info: Diese Funktion ist aktuell auf maximal 4 Command-Namen begrenzt.


    Changelog
    2.0.2 (8.1.2013)
    - Offizielle Unterstützung von SA:MP 0.3x


    2.0.3 (28.5.2013)
    - ALS-Hook (Verbesserte Kompatiblität zu anderen Includes)


    2.1.0 (24.7.2013)
    - ocmd@-Syntax für mehrere Commands mit einer Funktion (siehe Profi-Funktionen)


    2.1.1 (3.11.2013)
    - OCMD_COMMAND_LOG_FORMAT kann genutzt werden, um das Verhalten von OCMD_COMMAND_LOG anzupassen (siehe Profi-Funktionen)
    - Verbesserte Kompatiblität zu anderen Includes und Scripts


    Download
    Download der .inc
    Pastebin


    mit freundlichen Grüßen, k.O.

    Aktuellste:/*
    OCMD 2.0.1
    by Kleiner Opa
    best command-solution for sa:mp
    supports samp 0.2X, 0.3a, 0.3b, 0.3c, 0.3d, 0.3e
    email: fisch70000@gmail.com
    http://forum.sa-mp.de/index.php?page=User&userID=24998
    */


    #include <a_samp>


    forward ocmdOnPlayerCommandText(playerid,cmdtext[]);
    #if defined OCMD_BEFORE_CALLBACK
    forward BeforePlayerCommandText(playerid,cmdtext[]);
    new bool:ocmdBeforeCallback,bool:ocmdInit;
    #endif


    #define ocmd:%1(%2) forward ocmd_%1(%2);\
    public ocmd_%1(%2)


    public OnPlayerCommandText(playerid,cmdtext[])
    {
    #if defined OCMD_BEFORE_CALLBACK
    if(!ocmdInit)
    {
    if(funcidx("BeforePlayerCommandText")!=-1)ocmdBeforeCallback=true;
    ocmdInit=true;
    }
    #endif
    new ocmdStr[32]="ocmd_",
    i=1,
    #if defined OCMD_COMMAND_LOG
    ocmdName[MAX_PLAYER_NAME],
    #endif
    bool:ocmdNoParams;
    #if defined OCMD_COMMAND_LOG
    GetPlayerName(playerid,ocmdName,sizeof ocmdName);
    printf("[cmd] [%s]: %s",ocmdName,cmdtext);
    #endif
    #if defined OCMD_BEFORE_CALLBACK
    if(ocmdBeforeCallback&&!CallLocalFunction("BeforePlayerCommandText","ds",playerid,cmdtext))return 1;
    #endif
    for(;i<128;i++)
    {
    if(!cmdtext[i]||cmdtext[i]==' ')
    {
    if(!cmdtext[i]||!cmdtext[i+1])ocmdNoParams=true;
    break;
    }
    ocmdStr[i+4]=tolower(cmdtext[i]);
    }
    if(!ocmdNoParams&&CallLocalFunction(ocmdStr,"ds",playerid,cmdtext[i+1]))return 1;
    if(ocmdNoParams&&CallLocalFunction(ocmdStr,"ds",playerid," "))return 1;
    return CallLocalFunction("ocmdOnPlayerCommandText","ds",playerid,cmdtext);
    }


    #define OnPlayerCommandText ocmdOnPlayerCommandText

    Im /buycar-Befehl einfach nach RemovePlayerFromVehicle(playerid); das einfügen: break;


    Dann fehlt aber auch am Anfang der Schleife noch die Abfrage, ob der Spieler im richtigen Auto sitzt, sonst kauft er immer ID 0

    Antwort auf beide deine Fragen: Scripte dir doch selbst ein /carlock-System, dann entspricht es genau deinen Ansprüchen und du hast etwas, das du scripten kannst. :)