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
  • und jeder Callback muss 20ms verarbeitet werden


    Dafür macht man ja abfragen, das das Script nicht plötzlich was ausführt was gerade nicht relevant ist.


    So springt das Script von Funktion zu Funktion und gut ist. Wie man da auf eine hohe Ausführungszeit kommen möchte ich mir ein Rätsel.
    Voraussetzung ist natürlich, das man es auch richtig macht.

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

    Margarete Stokowski

  • Da das Skript in einem Thread läuft...glaubst du wirklich 30 Funktionsaufrufe dauern da so lange wie einer?!


    ...das erschließt sich mir nicht so wirklich :rolleyes:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • und ich hab die idee mit dem Controller aufgezeigt um genau sowas zu verhindern, aber auch ohne callbacks ist das gesamte nicht wirklich schneller und dein beispiel ist falsch ^^.
    den code den du seperat ausführst musst du um das zu vergleichen zusammenführen.


  • Was ist das für 'n Test ?


    Du sagst von Funktion zu Funktion, ballerst da aber eine Schleife mit 1000 durchläufen rein.
    Das hat doch überhaupt keinen Bezug zu einander.

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

    Margarete Stokowski

  • Und wie könnte man Hooks am beste nutzen ? Für eher kleine Systeme oder doch größere ?


    Ich persönliche nutze die Methode die @BlackAce: in seinem Open Pawn Projekt nutzt. Hatte vor alle Systeme in seperate Includes zu schreiben, aber wenn ich lese,dass es die Performance negativ beeinflusst, komme ich ins grübeln.


    Wie siehts aus, hat es irgendwelche groben Nachteile oder kann ich so weiter machen ?


  • Wie siehts aus, hat es irgendwelche groben Nachteile oder kann ich so weiter machen ?


    Es kommt im grunde darauf an, wie du es machst.
    Prüfst du halt gar nichts und lässt alles einfach durchlaufen, dann hast du hohe Ausführungszeiten.
    Die hast du aber auch, wenn du alles in ein Callback haust,


    Ich halt das immer so, das wenn ich weiß, das diese Funktion zu 100% beendet ist und danach nichts mehr kommt ich einfach ein return hinsetze.
    Das verhindert weitere Ausführungszeit.


    Man sollte auch immer prüfen, ob der Teil des Callbacks auch momentan relevant ist - if statements etc.

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

    Margarete Stokowski

  • Ich pushe mal an dieser Stelle - zusätzlich habe ich das Tutorial an den neuen BBCode angepasst.
    Leider zerhaut WBB mir jedesmal die Tabs und Leerzeichen, deswegen sie das aktuell sehr gequetscht aus.
    In der Vorschau, war es allerdings richtig ._.

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

    Margarete Stokowski

  • habs versucht aber kriege immer wieder die meldung dass OnPlayerRequestClass schon defined ist

  • Wie sieht denn dein Code aus?

    Gamemode - Ausschnitt:


    C
    forward _OnPlayerRequestClass(playerid,classid);
    public OnPlayerRequestClass(playerid, classid)
    {
    	SetPlayerPos(playerid,1420.6406,-1719.2148,6.8594);
    	SetPlayerCameraPos(playerid,1420.6908,-1714.8286,6.8664);
    	SetPlayerCameraLookAt(playerid,1420.6406,-1719.2148,6.8594);
    	SetPlayerFacingAngle(playerid,357.3007);
    	return 1;
    }
    #define OnPlayerRequestClass _OnPlayerRequestClass


    include-ausschnitt:

    C
    public OnPlayerRequestClass(playerid, classid)
    {
    	ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"Charakterauswahl","test des dialogs","schließen","");
    	SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    	SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    	SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    	return 1;
    }
    #define OnPlayerRequestclass _OnPlayerRequestclass


    //natürlich habe ich oben im gamemode das include inkludiert

  • Mache es so:
    Im Gamemode:

    C
    public OnPlayerRequestClass(playerid, classid)
    {
        SetPlayerPos(playerid,1420.6406,-1719.2148,6.8594);
        SetPlayerCameraPos(playerid,1420.6908,-1714.8286,6.8664);
        SetPlayerCameraLookAt(playerid,1420.6406,-1719.2148,6.8594);
        SetPlayerFacingAngle(playerid,357.3007);
        return 1;
    }


    In der Include:


    Beachte, dass OnPlayerRequestClass und somit das SetPlayerPos (etc) zuerst in der Include ausgeführt wird, sprich es ist unwirksam, wenn im Gamemode nochmals SetPlayerPos verwendet wird. Wenn du verhindern willst, dass OnPlayerRequestClass im Gamemode ausgeführt wird, dann musst du das CallLocalFunction in der Include entfernen, bzw. über eine if-Abfrage entsprechend verhindern.

  • sry ich hatte ne ganz lange liste mit fragen aufgeschrieben aber das wurde zu unübersichtlich denke das klärt sich besser von selbst. sitze jetzt schon seit ner halben stunde vor diesem code und raffe ihn net. sry wenn ich dir blöd komm aber kannst mir das nochmal erklären? @Jeffry

  • 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.

  • @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

  • 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?

  • @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
    #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).