Beiträge von BlackFoX

    Jeder Streamer arbeitet im Prinzip gleiche, Objekte werden mit einer Distanzformel berechnet & erstellt bzw. die Optimale Distanz
    wird errechnet & Objekte werden erstellt, Maximale sind immer so viele Objekte Möglich wie sie für jeden Spieler limitiert sind ,
    also werden auf Distanz immer Maximal so viele Objekte erstellt wie erlaubt sind,
    Unterschiede gibt es in der Technik wobei ich der Meinung bin :


    Plugin Streamer greifen doppelt indirekt zu da sie 3 Wege gehen müssen um ihre Aktion zu tätigen, C++ jedoch ein sehr optimierter Code,
    Streamer die über Pawn laufen haben 2 Wege , laufen aber genau so gut wie Plugin streamer laufen würden,
    das sind die Prinzipien also müsstest du schauen welcher Streamer logischer & optimierter geschrieben wurde,
    so hast du die höchste rate laggs zu vermeiden & auch mit mehreren Spielern sorgenlos zu spielen,
    zum Teil hängt das ganze auch an Sa-mp , wäre das logischer zusammengestellt worden wäre es heute einfacher.

    Das Script kann nicht aus heiterem Himmel kaputt gehen daher bin ich mir mehr sicher das eine Makros Abfrage bzw. ein Bereich erstellt
    wurde Möglicherweise nicht einbezogen aufgrund von bestimmten Tatsachen.

    Kann meine Vermutung nur noch einmal wiederholen ( sieh dich Nach Präprozessor Abfragen um #if,#else,#endif ), schau ob die Anweisungen stimmen...

    Wie gesagt der Präprozessor lässt sich während der Laufzeit nicht ändern , er ist Konstant / fest ,
    normale Variablen seitens Pawn sind nicht im geschützten Speicher.


    new bla = 200;
    new index[bla]; // << Fehler Konstante wird erwartet


    Der Grund ist, wie gesagt , der Speicher muss eine Konstante Angabe enthalten da er sich während der Laufzeit ebenfalls nicht verändern lässt,
    deutlicher :


    new var1 = 12;
    new var2 = 13;



    Im Speicher

    Code
    var1 | var2
    0x8272 | 0x772


    nur als Beispiel


    so würde sich var1 nun verschieben sprich in der Größe , hier ist die Größe je nach Datentyp festgelegt , in dem Fall Integer
    würde diese aber nun Dynamisch den Datentyp ändern würde es verehrende folgen haben,


    var1 verschiebt sich nun in den Speicherabschnitt von var2 was Falsche Werte ergeben würden & somit Fatal für den Code wäre
    genau gesagt würde der Code hängen oder var2 würde fehlende oder Falsche Werte haben.


    daher muss die Angabe Konstant sein , alles muss vorher reserviert werden so kann es auch nicht zu solche Fatalen Fehlern kommen.

    Also der Präprozessor ist Zwischencode der nur im Compiler was bringt , da der Compiler dementsprechend handelt durch diese Makros,
    diese werden im Endprodukt nicht einbezogen , weshalb als Index jetzt auch keine nicht Konstanten Werte angenommen werden:


    Compiler Ablauf


    #define deinmakro 50
    new item[deinmakro];


    Der Compiler macht daraus


    new item[50];


    sprich ersetzt den Wert gleich im Speicher, der Bezeichner wird dabei nicht einbezogen & läuft nur in der Cache nebenher danach wird der Präprozessor Code verworfen


    genau das gleich passiert hier im Grunde :



    #if blabla
    // dein Code1


    #endif


    // dein Code 2



    So der Compiler überprüft die Anweisung & das was sein muss , bei Rückgabe = Falsch wird der Code bis dem dazugehörigen #endif nicht mit in den Speicher einbezogen,
    sprich es landet nicht im Endprodukt wenn ja dann wird es einbezogen , so nun wird aber der Präprozessor Code nicht mit einbezogen da
    es im Endprodukt nicht mehr benötigt wird & die Ausgabe damit nichts anfangen könnte.


    Sprich du kannst den Präprozessor während des Ablaufs / während der Laufzeit nicht beeinflussen , es lassen sich nur im Quellcode vorkehrungen treffen,
    also Präprozessor = Compiler Optionen.


    Compiler Ablauf


    • Kommentare rausschneiden & stellen wie Leerzeichen etc. > Code Optimierung
    • Lexikalische Analyse > Fehler Überprüfung & Zusammensetzung
    • Code wird interpretiert & alles nötige wird definiert / deklariert
    • Code wird vom Compiler umgewandelt & im Speicher zusammengesetzt
    • Binäre Ausgabe erfolgt.


    Kurz und knapp , du hast keine Möglichkeit den Speicher einer Variable zu verändern jedenfalls nicht in Pawn du musst mit Konstanten Werten arbeiten,
    da diese Sprache nicht auf einer JIT Engine arbeitet sondern vorher reserviert & alle Vorkehrungen trifft, wären wir bei Lua & Suqirrel ,
    sehe das ganze anders aus da alles nochmal Just in Time kompiliert wird also Live

    Wenn du versuchst eine nicht konstante als Index für eine Variable zu verwenden sprich für feste Werte klappt das auch nicht.
    Das liegt daran das der Compiler den Speicher reserviert der Später nicht geändert werden darf da es sonst zu kritischen Fehlern kommen kann.

    Zudem können Präprozessor Eigenschaften nicht verändert werden, diese werden nur einmalig übersetzt & nur für den kompilierungsvorgang beachtet ^^
    Sprich sie dienen nur dem Compiler was , in der Ausgabe nützen sie nichts da sie nicht mehr existieren.

    Präprozessor Direktiven sind solange gültig solange der Code läuft unabhängig davon in welchem Bereich sie erstellt werden, sie bleiben definiert auch
    wenn der Code den Bereich verlässt in dem sie erstellt wurden, zum löschen gibt es Funktionen ,,undef´´

    Lieber erstellst du einen Timer oder benutzt einen Timer Maximal auf 800 - 1000 ms läuft so das du Ressourcen sparst , OnPlayerUpdate reagiert viel zu oft, vergleichbar
    mit 50-100ms

    Wie es halt gemacht wurde


    Zeit in die Variable übernehmen
    Zeit abfragen ( if(times[0] == 12 && times[1] == 38) )
    und die jeweiligen Aktionen durchführen,
    wenn die anderen Anzeigen verschwinden sollen auch wieder in der Abfrage ausblenden.


    Bleibt das selbe Prinzip

    Was benutzt du denn? DCMD, strcmp oder ganz was anderes?

    Wo soll das denn anders sein, in der Funktion wird ebenfalls strcmp genutzt , außerdem ist dcmd nicht so schnell wie alle meinen...
    nur weil dort sscanf genutzt wird heißt es nicht das dies auch nicht in der normalen Überprüfung geht.


    @Thema : Wenn wir dir zeigen wie ein Kommando geht solltest du zu mindestens die Sprache selber verstehen sonst können wir dir
    das ganze noch 10x vorkauen & du weißt nicht welchen Sinn dieser Code ergibt, glaub mir so erleichterst du dir ganz viel außerdem
    sparst du dir Fragen wie diese, aber ich denke dieser Rat wird sowieso wieder nicht beachtet.

    Beispiel, jede neue Stunde & und 38te Minute


    new times[3],oldtime,retstr[32];
    gettime(times[0],times[1],times[2]);
    if(oldtime!=times[0] && times[1] == 38)
    {
    oldtime = times[0];
    format(retstr,sizeof retstr,"Es ist nun %02d:%02:%02d",times[0],times[1],times[2]);
    SendClientMessageToAll(0x0000FFFF,retstr);
    }