Includes richtig erstellen | Hooking ganz einfach

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
  • Mit Includes lässt sich ja dann auch Struktur ins Script bringen. Wie genau stelle ich das jetzt an?


    In habe jetzt z.B. ein Bank System, dass ich separat in einer Include haben möchte, und benutze dafür 3 Callbacks: OnGameModeInit, OnDialogResonse und OnPlayerEnterDynamicCP.
    Die 3 Callbacks muss ich dann IN der Include hooken, nicht wahr? Beispielsweise:


    forward BANK_SYSTEM_OnGameModeInit(); //Callback forwarden


    public OnGameModeInit() //Callback normal aufrufen
    {
    //Code
    return 1;
    }


    //Callback hooken


    #if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
    #else
    #define _ALS_OnGameModeInit
    #endif
    #define OnGameModeInit BANK_SYSTEM_OnGameModeInit


    Um die ganzen Systeme, die ich dann nach und nach machen werde, brauche ich ja dann ein "Mother-Script", wo ich die ganzen Systeme inkludieren kann.
    In diesem muss ich dann CallLocalFunction benutzen:


    public OnGameModeInit()
    {
    CallLocalFuntion("BANK_SYSTEM_OnGameModeInit", ""); //Bin mir nicht ganz im Klaren darüber, wie die Funktion handzuhaben ist, das Wiki hilft mir nicht wirklich.
    return 1;
    }


    Stimmt das soweit?

  • Stimmt das soweit?


    Nicht ganz.


    Ich mach das immer so

    public OnGameModeInit()
    {
    /*
    code
    */
    return Init_OnGameModeInit();
    }
    forward Init_OnGameModeInit();
    #if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
    #else
    #define _ALS_OnGameModeInit
    #endif
    #define OnGameModeInit Init_OnGameModeInit
    Ich geh hier nicht über die Localfunction, denn ich weiß ja das diese Funktion implementiert ist.


    Mehr ist das insgesamt auch nicht.
    Du darfst halt nicht die Funktionen / den Hook gleich benennen.


    Ich mach das Datei für Datei, so kann ich immer sehen wo gerade was und wie abläuft ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Ah, also auf mein Beispiel übertragen wäre das dann so: Wir nehmen mal OnDialogResponse.


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    /*
    code
    */
    return BANK_SYSTEM_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
    }


    forward BANK_SYSTEM_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
    #if defined _ALS_OnDialogResponse
    #undef OnDialogResponse
    #else
    #define _ALS_OnDialogResponse
    #endif
    #define OnDialogResponse BANK_SYSTEM_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])


    Damit ich das jetzt nicht alles verwechsel: Der obige Code gehört in die Include, nicht in das "Mother-Script"?


    Im Script selber nichts? Versteh ich nicht ganz.^^

  • Damit ich das jetzt nicht alles verwechsel: Der obige Code gehört in die Include, nicht in das "Mother-Script"?


    Richtig


    Im Script selber nichts? Versteh ich nicht ganz.^^


    Du bastelst das Script selber ja über die Includes zusammen.
    Das ist dann das gesamt Script, welches du dann als .amx findest.


    Im Main Script kannst du natürlich trotzdem noch arbeiten ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Okay, macht soweit Sinn. Eine etwas spezifischere Frage hätte ich allerdings noch.
    Wenn ich versuche zu kompilieren, dann zeigt er mir an, dass z.B. eine Color define fehlt oder pInfo, eine Variable aus dem Acc-System.
    Muss ich dann alle defines bzw mein acc enum in jedem Include haben, um darauf zugreifen zu können?
    MUSS ich die einzelnen Includes ganz oben im Script inkludieren?

  • Um auf Variablen zuzugreifen, müssen diese natürlich vorher bekannt sein.


    Im Grunde heißt das


    enum blaa
    {
    var1,
    var2,
    };
    new Bla[MAX_PLAYERS][blaa];


    #include <Bank_System>
    Wenn du willst, kannst du die Variablen auch in eine seperate Include packen.
    Diese muss aber vorher includiert werden :thumbup:

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Das CallRemoteFunction weg lassen ist nicht wirklich Optimal und macht das Include auch überhaupt nicht "richtig" (so wie es der Thread-Name eigentlich sagt). Unkompatibilität ist da vorprogrammiert.


    Weg lassen geht aber trotzdem, seit Jahren ist das eigentlich die gängige Methode auf forum.sa-mp.com: (hier scheint noch alles nach dem Alten zu laufen)
    public OnGameModeInit()
    {
    //-------------------


    //-------------------



    #if defined MyIncName_OnGameModeInit
    MyIncName_OnGameModeInit();
    #endif
    return 1;
    }


    #if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
    #else
    #define _ALS_OnGameModeInit
    #endif
    #define OnGameModeInit MyIncName_OnGameModeInit
    #if defined MyIncName_OnGameModeInit
    forward MyIncName_OnGameModeInit();
    #endif

  • Erstens: Inwiefern Inkompabilität vorprogrammiert?


    Zweitens: Ich habe nun "return BANK_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);" unter dem entsprechenden Callback returnt, allerdings kriege ich die Fehlermeldung "error 029: invalid expression, assumed zero". Wie mache ich das bei den Dialogen? Nur einmal am Ende des Callbacks oder nach jedem einzelnen Dialog returnen?

  • Das CallRemoteFunction weg lassen ist nicht wirklich Optimal und macht das Include auch überhaupt nicht "richtig"


    Öhm, wenn es mich nicht täuscht wird doch das Callback in einem Gamemode zu letzt aufgerufen.
    Deswegen sollte doch LocalFunction ausreichen :huh:


    Siehe Zitat:

    Dafür hat SA:MP die Funktion CallLocalFunction.
    Diese Funktion lässt uns Funktionen direkt aus dem Script, in dem es verwendet wird laden.


    Manyula:
    Das ist ein normaler Funktionsaufruf, deswegen die [] bei inputtext weglassen


    d0ma:
    Eine Sache noch.
    Das wäre aber nur was bringen, wenn man MyIncName_OnGameModeInit vorher "definiert" hat.
    Was im Grunde ja eigentlich Schwachsinn ist.
    Ob das forward jetzt da steht oder nicht, wird weder den Server noch PAWN selbst irgendwie interessieren :huh:

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen

  • Öhm, wenn es mich nicht täuscht wird doch das Callback in einem Gamemode zu letzt aufgerufen.
    Deswegen sollte doch LocalFunction ausreichen :huh:


    meinte CallLocalFunction, nur verschrieben ;)

    d0ma:
    Eine Sache noch.
    Das wäre aber nur was bringen, wenn man MyIncName_OnGameModeInit vorher "definiert" hat.


    der Code von mir Funktioniert genau so wie er da steht, als Hook. Liegt am komischen Verhalten vom Pawn-Compiler. Vom logischen her sollte es nicht funktionieren, tut es aber.
    Kannst hier nachlesen: http://forum.sa-mp.com/showthread.php?t=441293 + Ersten 4 Antworten

  • Wie mache ich das dann, wenn ich einen CMD in eine Include packe? Was returne ich, wenn kein Callback inbegriffen ist, wie z.B. bei ZCMD?


    CMD:ls(playerid, params[])
    {
    SetPlayerPos(...);
    return 1; //?
    }


    Wenn ich "return 1;" mache, dann passiert einfach nichts.

  • Ich hab meine CMD Includes immer als letztes drin
    #include <crimetime/a_samp>
    #include <crimetime/bcmd>
    #include <crimetime/praeprozess>
    #include <crimetime/PlayerVars>
    #include <crimetime/VehicleVars>
    //weiterer Kram
    #include <crimetime/CMDs/Car>
    #include <crimetime/CMDs>
    Möglicherweise liegt das an der Reihenfolge die du drin hast

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Ich hab sie auch ganz unten.


    #include <a_samp>
    #include <streamer>
    #include <zcmd>
    #include <banfix>
    #include <Bank_System>
    #include <Deathmatches> //system + cmds
    #include <Admin_CMDs> //nur cmds
    #include <Teleports> //nur cmds


    EDIT: Mein Fehler, ich hatte eine fehlerhafte stock Funktion...


    Ich hätte da aber trotzdem noch eine Frage. Macht diese Art der Strukturierung das Script letztendlich nicht länger? Wenn man jedes System separat in einer Include hat, dann kann es doch sehr gut vorkommen, dass du z.B. in 9 von 10 Systemen immer OnGameModeInit() benutzt + die Hooking Zeilen ergebeb dann einiges mehr an Zeilen.

    Einmal editiert, zuletzt von Manyula ()

  • #if defined _ALS_GFSInit
    #undef OnGameModeInit
    #else
    #define _ALS_GFSInit
    #endif
    #define OnGameModeInit GFSInit


    #if defined _ALS_GFSExit
    #undef OnGameModeExit
    #else
    #define _ALS_GFSExit
    #endif
    #define OnGameModeExit GFSExit


    #if defined _ALS_OnPlayerDeath
    #undef OnPlayerDeath
    #else
    #define _ALS_GFS_OnPlayerDeath
    #endif
    #define OnPlayerDeath GFS_OnPlayerDeath


    #if defined _ALS_OnPlayerConnect
    #undef OnPlayerConnect
    #else
    #define _ALS_GFS_OnPlayerConnect
    #endif
    #define OnPlayerConnect GFS_OnPlayerConnect


    Habe noch eine andere Include, da ist es genau so ( halt nur nicht gleiche Namen ) und ich bekomme die Fehler:

    Zitat

    redefinition of constant/macro