Includes richtig erstellen | Hooking ganz einfach

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
    Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

    • @Jeffry
      habe deinen code noch nicht ausprobiert, damit würde es sicher klappen. leider will ich scripten lernen und wenn ich nur copy paste mache lernt man das halt net :P
      deswegen wärs nice wenn du mir das ein bisschen erklären könntest
    • @Jeffry
      1. fällt mir grade auf wenn ich den code einfüge bekomme ich ein warning:
      C:\Users\SunRiZez\Desktop\server\gamemodes\UltimateReallife.pwn(343) : warning 201: redefinition of constant/macro (symbol "OnPlayerRequestClass")
      2.erwähnst du mehrmals im code "Hook_OnPlayerRequestClass", diese function existiert aber nicht.
      3. z.B. hier: #if defined _ALS_OnPlayerRequestClass du fragst hier ab ob etwas als _ALS_OnPlayerRequestClass defined wurde. aber was denn?
    • 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-Quellcode

      1. #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-Quellcode

      1. 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-Quellcode

      1. //Wenn _ALS_OnPlayerRequestClass definiert ist
      2. #if defined _ALS_OnPlayerRequestClass
      3. //dann ent-definiere OnPlayerRequestClass, damit es später wieder definiert werden kann.
      4. #undef OnPlayerRequestClass
      5. #else
      6. //ansonsten definiere _ALS_OnPlayerRequestClass
      7. #define _ALS_OnPlayerRequestClass
      8. #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).
    • @Jeffry danke ich bin sehr froh das ganze endlich verstanden zu haben!
      in der abrage ob _ALS_OnPlayerRequestClass als "irgendetwas" also in deinem beispiel als "" definiert ist, "speichert" man also quasi improvisiert ab, ob schon das gamemode-OnPlayerRequestClass als hook_OnPlayerRequestClass defined wurde? entschuldige die umständliche formulierung.


      //EDIT
      nachdem du alles so genial erklärt hast verbleibt dann doch noch eine frage:
      beim teil

      C-Quellcode

      1. return CallLocalFunction("Hook_OnPlayerRequestClass","ii",playerid, classid);
      also was in der funktion steht kannst du mir da auch nochmal erklären was also passiert ist?
    • sunrizez schrieb:

      in der abrage ob _ALS_OnPlayerRequestClass als "irgendetwas" also in deinem beispiel als "" definiert ist, "speichert" man also quasi improvisiert ab, ob schon das gamemode-OnPlayerRequestClass als hook_OnPlayerRequestClass defined wurde?
      Ja, du speicherst eben, dass du das Callback bereits gehookt hast.


      sunrizez schrieb:

      also was in der funktion steht kannst du mir da auch nochmal erklären was also passiert ist?
      Das ruft die Funktion Hook_OnPlayerRequestClass auf, also das OnPlayerRequestClass aus dem Gamemode, was der Compiler ja zu Hook_OnPlayerRequestClass umbenannt hat. Da es hier aber zwischen " " steht, müssen wir das "Hook_" mit angeben, da der Compiler in Strings nichts ersetzt.
    • @Jeffry nenn' mich blöde aber das raffe ich immer noch nicht. Was meinst du mit "mit angeben"?
      denn das gamemode- OnPlayerRequestClass heißt ja eh schon hook_OnPlayerRequestClass, also deswegen müssen wir das ja auch so aufrufen oder? also ich mein ich versteh nicht was das mit den "" zu tun hat.
      außerdem heißt es ja CallLocalFunction, obwohl wir doch vom include her das gamemode-OnPlayerRequestClass aufrufen?
    • sunrizez schrieb:

      das gamemode- OnPlayerRequestClass heißt ja eh schon hook_OnPlayerRequestClass
      Ja, aber in deinem Gamemode-Code steht ja OnPlayerRequestClass, das wird durch das Hook_OnPlayerRequestClass in der Include aufgerufen.
      Ich wollte nur deutlich machen, dass du in CallLocalFunction nicht einfach "OnPlayerRequestClass" schreiben kannst.


      sunrizez schrieb:

      außerdem heißt es ja CallLocalFunction, obwohl wir doch vom include her das gamemode-OnPlayerRequestClass aufrufen?
      Da die Include in den Gamemode eingebettet ist, ist es ein lokaler Aufruf.
      Ein CallRemoteFunction wäre es aus einer anderen .pwn Datei.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Jeffry ()

    • @Jeffry
      Hook_Hook_OnPlayerRequestClass war hoffentlich ein tippfehler oder habe ich wieder etwas nicht verstanden?

      außerdem was kann ich gegen diese beiden warnings machen?

      \gamemodes\UltimateReallife.pwn(343) : warning 201: redefinition of constant/macro (symbol "OnPlayerRequestClass")

      \gamemodes\UltimateReallife.pwn(820) : warning 203: symbol is never used: "Hook_main"

    • sunrizez schrieb:

      Hook_Hook_OnPlayerRequestClass war hoffentlich ein tippfehler
      Oh ja, Copy-Paste. ^^


      sunrizez schrieb:

      außerdem was kann ich gegen diese beiden warnings machen?
      Zu 1: Da wird OnPlayerRequestClass doppelt definiert. Kommt auf den Code drauf an, was man da machen muss, poste den gegebenenfalls mal.
      Zu 2: Den hook von main nutzt du nie, da hast du wohl was falsch gemacht. Mache es besser mit OnGameModeInit, da main kein public ist.
    • @Jeffry
      1.welchen Code soll ich posten?
      2. sollte doch mit normallen callbacks (das ist doch die bezeichnung von funktionen in pawno oder?) auch gehen, und könnte es vielleicht daran liegen, dass ich das "return CallLocalFunction("Hook_main","ii");" falsch platziert habe?
      3. was macht eigentlich "return" allgemein? weil bei vielen sachen steht ja so was wie "return 1;"?
    • @Jeffry
      1. Mann bin ich blöd! Als ich kopieren wollte ist mir aufgefallen, dass ich doch noch ein paar Sachen da bei der Funktion stehen hatte die da nicht hingehören-.- jetzt geht es.
      3. Und was bedeutet dann das was danach steht? Wenn man z.B. return CallLocalFunction[...] schreibt, oder auch return 1 oder return 0 oder was auch immer es gibt, was bedeutet das?
    • 3.
      Dass dann diese Anweisung ausgeführt wird, mit dem Beenden der vorherigen Funktion, und der Wert, den diese Anweisung zurück gibt, dann zurück gegeben wird (falls es irgendwo abgefragt wird).
      Meistens sagt man:
      return 1 = Alles ok
      return 0 = Fehler
      (Nicht immer so)

      Den Funktionsaufruf im return muss man nicht machen, man kann ihn auch vor das return 1; schreiben, das ist oftmals nur Stilsache.
    • Guten Tag, ich wollte OnPlayerGiveDamageDynamicActor im Include Hooken aber dann kommt dass es mehr als 31 Zeichen lang ist was kann ich da machen ?

      Quellcode

      1. public OnPlayerGiveDamageDynamicActor(playerid, STREAMER_TAG_ACTOR actorid, Float:amount, weaponid, bodypart)
      youtube.com/channel/UC5TZUUd86…AZ4dYQ?view_as=subscriber

      Biete Scripting Service an bei Interesse ->Pn
      Verkaufe Selfmade Script bei Interesse -> Pn