Beiträge von Jeffry

    So wäre es am geschicktesten und performantesten:

    C
    CMD:kill(playerid,params[])
    {
        if (IsPlayerInRangeOfPoint(playerid, 200.0,1858.1184,-2485.4265,5048.4761)) return eMSG(playerid);
    
        //...
    
        return 1;
    }


    Und dann unter den Includes:

    C
    #define eMSG(%0) SendClientMessage(%0,WHITE,"{FF1717}ERROR:{FFFFFF} You can't use this command during an event. Use {FF1717}/eleave{FFFFFF} to leave the event!")

    Zu Punkt 1:
    Die Warnung sagt aus, dass du im Code zwei mal ein #define OnPlayerRequestClass hast. Es sollte eigentlich nur in dem Code vorhanden sein, den ich dir gegeben habe, es sei denn es wird bereits ein Hook verwendet auf dieses Callback, der nicht nach diesem System aufgebaut ist.




    Zu Punkt 2:
    Die Funktion Hook_OnPlayerRequestClass existiert "virtuell".
    Durch diese Zeile

    C
    #define OnPlayerRequestClass Hook_OnPlayerRequestClass

    sagen wir dem Compiler, dass von jetzt an (alles was danach folgt) alle "OnPlayerRequestClass" mit "Hook_OnPlayerRequestClass" ersetzt werden sollen (siehst du nicht, das macht der Compiler beim kompilieren). Das bedeutet, dass das OnPlayerRequestClass im Gamemode (kommt ja nach der Include) zu Hook_OnPlayerRequestClass umbeannt wird.

    C
    forward Hook_OnPlayerRequestClass(playerid, classid);

    Stellt dann den Funktionskopf, damit die Funktion Hook_OnPlayerRequestClass auch deklariert ist.


    Was also passiert ist:
    Compiler geht in die Include -> kompiliert dort das OnPlayerRequestClass -> benennt danach alle folgenden OnPlayerRequestClass um zu Hook_OnPlayerRequestClass -> geht in den Gamemode zurück -> kompiliert OnPlayerRequestClass im Gamemode, welches Hook_OnPlayerRequestClass heißt.
    Im Betrieb: OnPlayerRequestClass wird aufgerufen (befindet sich nur in der Include, weil im Gamemode wurde es ja zu Hook_OnPlayerRequestClass umbenannt) -> Am Ende von OnPlayerRequestClass in der Include wird mit CallLocalFunktion dann Hook_OnPlayerRequestClass aufgerufen -> OnPlayerRequestClass im Gamemode wird ausgeführt (vom Compiler als Hook_OnPlayerRequestClass bekannt).




    Zu Punkt 3:
    Es ist egal was dafür definiert wurde, es geht nur darum, ob es definiert wurde.
    Das ist in diesem Code hier:

    C
    //Wenn _ALS_OnPlayerRequestClass definiert ist
    #if defined _ALS_OnPlayerRequestClass
        //dann ent-definiere OnPlayerRequestClass, damit es später wieder definiert werden kann.
        #undef OnPlayerRequestClass
    #else
        //ansonsten definiere _ALS_OnPlayerRequestClass
        #define _ALS_OnPlayerRequestClass
    #endif

    Genau genommen wird es als '' definiert, also nichts. Es ist aber definiert, nur halt als nichts. Daher reicht die Abfrage so. Du kannst es auch als Apfelkuchen definieren, das spielt keine Rolle, da es ohnehin nirgends verwendet wird, außer in der Abfrage, ob bereits gehookt wurde, also ob _ALS_OnPlayerRequestClass definiert ist.
    Prinzipiell kann man diesen Teil auch komplett weg lassen, nur kommt es dann zu Problemen, wenn man das Callback in einer anderen Include bereits gehookt hat (das wäre dann genau die Warnung aus Punkt 1).

    Diese #define-Struktur brauchst du eigentlich nicht auswendig zu können, ich kopiere die auch immer nur und ersetze die entsprechenden Teile mit den neuen Bezeichnungen, weil es schneller geht.
    Welchen Teil von dem Code willst du denn erklärt haben? Einen bestimmten, oder alles davon?

    Gute Sache!


    Aber ein paar Fragen/Dinge dazu:
    1) Kann ich eine Erklärung bearbeiten, wenn ja, wie?
    2) Kann ich irgendwo meine gesendeten Erklärungen sehen?
    3) WDas Profil Bild wird bei mir nicht angezeigt.
    4) Kann man PWN Codes formatiert einfügen, oder den <img> Tag nutzen? (Hätte es probiert, wusste aber nicht ob ich es nochmal editieren kann).

    Ersteres ist vom Speicher her minimal besser, da es minimal weniger benötigt, und von der CPU Last ebenfalls etwas besser, da der Zugriff auf mehrdimensionale Arrays etwas langsamer ist.


    Das sind aber jeweils minimale Unterschiede, die du unter normalen Umständen nicht bemerken wirst.

    Schreibe deinen SetSkin stock so:

    Der Code ist aber ziemlich abenteuerlich.


    OnPlayerStateChange kannst du so machen:


    Den /rentcar Befehl kannst du dann so machen:


    Der /verlassen Befehl bleibt weitgehend gleich.


    Wenn du es nun anpassen willst, dass das Fahrzeug für genau 30 Minuten aktiv ist, dann musst du eine Spielervariable anlegen, in der du den Wert speicherst, wann die Zeit vorbei ist und eine Variable die die Index ID beinhaltet, unter den Includes:

    C
    new rentTime[MAX_PLAYERS];
    new rentIdx[MAX_PLAYERS];

    Sowie eine Variable um das Fahrzeug als gemietet zu markieren (-1 = nicht vermietet):

    C
    new rentBlocked[MAX_VEHICLES] = {-1,...};


    Unter OnGameModeInit startest du einen Prüf-Timer:

    C
    SetTimer("CheckRentCars", 5000, true);

    [wiki]SetTimer[/wiki]


    Und der Code dazu:


    Den /rentcar Befehl musst du dann so anpassen:


    Bei OnPlayerDisconnect zum Beispiel:

    C
    if(rentTime[playerid] != 0)
    {
        new idx = rentIdx[playerid];
        SetVehicleToRespawn(rentroller[idx]);
        rentTime[playerid] = 0;
        rentBlocked[idx] = -1;
    }


    Und das OnPlayerStateChange sieht dann so aus:


    Beachte bitte die Kommentare im Code und passie die Stellen entsprechend an.

    Wie sieht denn dein Code aus, und was klappt denn nicht?
    Du musst den Code nicht im Detail verstehen, das ist einfach nur eine Hin-und-her-Definition. Man schält sich praktisch vor das Callback im Gamemode, definiert es um, und ruft es nach der Ausführung in der Include wieder im Gamemode, unter neuem Name, auf.

    Callbacks sind Funktionsbausteine (public's) die unter bestimmten Umständen (OnPlayerConnect -> Verbindung hergestellt) aufgerufen werden.
    Forwards sind dazu da, um selbst erstellte public's du instanziieren, da der Compiler sonst eine Fehlermeldung ausgibt, dass die forward-Funktion zu dem public fehlt (lacks forward definition ...). In manchen Fällen werden forwards aber auch anderweitig verwendet, zum Beispiel wenn du einen stock hast, der einen getaggten (Float:) Rückgabewert hat, dann muss der entweder vor der ersten Verwendung stehen (sprich in einer Include oder ganz oben im Code), oder ein forward enthalten.

    Ja, du musst den Download bestätigen (unterer Bildschirmrand).
    Oder nimm die .zip aus meinem Post. Die musst du gegebenenfalls aber auch bestätigen, je nach dem wie dein Browser eingestellt ist. Das ist eine gewisse Sicherheit, damit nicht aus Versehen etwas heruntergeladen wird.