Beiträge von Kaliber

    Okay, ich nehme mal kurz deinen Beitrag auseinander und sage was dazu:


    Ebenso hast du zwar #error verwendet, aber nirgens erklärt.


    #error = Erzeugt einen error (das steht da auch grob)


    ch hätte mir gewünscht, dass du noch ein paar #pragma-Sachen reingebracht hättest.


    Lese meinen letzten Satz...


    Auch #inlcude wäre sinnvoll.


    Das Directive Included eine Include datei, mehr aber auch weniger nicht.


    Du hast in der Überschrift was von pre-processor geschrieben, aber gerade darauf gehst du nicht weiter ein.


    Okay, da hast du recht, ich denke ich baue das noch ein wenig aus, wie der Compiler das ganze Script verarbeitet...


    sehe ich keinen Unterschied zwischen #if und if


    Dann hast du nicht genau hingeschaut, du kannst #if im Gegensatz zu if egal wo im Script verwenden.


    das ist doch erst das total spannende daran.


    Dein Leben scheint nicht sehr aufregend zu sein, wenn du es als "so spannend" hälst, dass der Compiler die Directives vor allem anderen verarbeitet :D


    Naja, ich werde es evtl noch hier und da ein wenig ausbauen :D


    mfg. :thumbup:

    Ein, in meinen Augen, sehr unbrauchbares Tutorial. Zwar zeigt es ein paar Direktiven, aber die sind in meinen Augen genauso selbsterklärend wie include*. In diesem Tutorial wird in die Thematik zu wenig eingegangen, Fragen wie "Wie greift der Compiler auf diese zu / wie werden sie verarbeitet" sind für in meinen Augen ein MUSS, wenn es um den angesprochenden Bereich geht.



    * Dieser Satz ist entstanden, da include von der Priorität her die höchste Direktive ist und scheinbar gewollt nicht genannt / erläutert wurde.


    Dieses Tutorial ist für Anfänger gedacht und ich fand es nicht so klug direkt zu erklären wie der Compiler das verarbeitet, da das ja nicht direkt was mit dem Scripten damit zu tun hat ^^
    un Include habe ich weggelassen, da das der einzige Directive mit Tryinclude ist, den man nicht wirklich erklären muss (wenn man ein wenig englisch kann) ^^


    mfg. :thumbup:

    Problem ist, ich weiss nicht wie ich das abfrage mit dem Geld :D Kann mir dort jemand helfen? Dann kommt das heut Abend noch dazu.


    if(GetPlayerMoney(playerid) < 50) return SendClienMessage(playerid, 0xFF0000FF,"Du besitzt zu wenig Geld für diesen Skin");


    mfg. :thumbup:

    Da solltest du einiges editieren:


    • if (strcmp("/info", cmdtext, true, 10) == 0)
      {
      GivePlayerMoney(playerid,1);
      }
      Was hat das GivePlayerMoney da zu suchen...raus damit :pinch:


    • Du solltest Abfragen bei deinem Dialog ob der Spieler überhaupt 50$ besitzt, sonst kann das tief in den Minus gehen...
    • 20x Skin 1..Skin2 geschrieben ist auch nicht das gelbe vom Ei einfach mal sowas gemacht:
      //Oben im Script
      static const string_dialog[128];
      //Unter OnGameModeInit
      new buffer[10];
      for(new i=1; i!=20; i++) format(buffer, sizeof buffer,"Skin %d\n",i),strins(string_dialog, buffer, 0, 128);


      //Und dann einfach bei deinem Dialog so einsetzen
      ShowPlayerDialog(playerid,dSkinshop,DIALOG_STYLE_LIST,"Bincoladen",string_dialog,"Bestätigen","Abbrechen");


    • Ich rate dir zur Nutzung von switch und case, da dieses um einiges schneller ist als eine if-Abfrage
    • Achte ein wenig auf Zeilensparen:
      Vorher (Dein Code):
      if(dialogid == dInfo)
      {
      if(response == 1)
      {
      SendClientMessage(playerid,Grün,"(c)Jacke2009");
      }
      if(response == 0)
      {
      SendClientMessage(playerid,Grün,"(c)Jacke2009");
      }
      return 1;
      }
      Optimierter Code:
      if(dialogid == dInfo) {
      if(response == 1)SendClientMessage(playerid,Grün,"(c)Jacke2009");
      else SendClientMessage(playerid,Grün,"(c)Jacke2009");
      }


    Nicht sehr viel Arbeit und auch nicht so schön :S


    mfg. :thumbup:

    Returning 0 in this callback will pass the dialog to another script in case no matching code were found in your gamemode's callback.


    woher weißt du jetzt das es sich hier um Filterscripts handelt und nicht um Includes die unter dem Callback included werden :huh:

    Guten Morgen liebe Community,


    also ich wollte euch heute nochmal ein wenig die Directives näher bringen, da ich leider immernoch in einigen Threads sowas sehe:


    #include <a_samp>


    #if defined FILTERSCRIPT
    public OnFilterScriptInit()
    {
    //Hier der entscheidene Code
    }
    #endif
    und dann wundern sich die Leute warum ihr Code nicht aufgerufen wurde :wacko:


    Also, dann fangen wir mal mit dem ersten Directive an:


    #define, #undef
    Mit #define können wir einen statischen Wert definieren sprich:
    #define Butter 1
    Jetzt besitzt Butter den Wert 1. Das ist die Einfachste Form einer Definition.
    Wir können aber noch viel viel weiter gehen und z.B. eine Funktion auf eine andere schreiben:
    #define SCM SendClientMessage
    Nun müssen wir nicht immer SendClientMessage(...); schreiben, sondern nur SCM(...);
    Aber man kann noch einen Schritt weiter gehen und Makros erstellen mit unterschiedlichen Parametern:
    So, nehmen wir nun eine andere Funktion, sagen wir mal printf und wir tauschen jetzt die Parameter sprich von:
    printf("Text", rest);
    machen wir:
    PP(rest, "Text");
    Sowas sieht dann so aus:
    #define PP(%1,%0) \
    printf(%0, %1)
    Was auch noch eine Möglichkeit wäre ist, ganze Funktionen bzw Codeschnipsel in so ein Define zu schreiben, quasi sowas:


    #define Loop \
    new i; i<MAX_PLAYERS; i++) \
    if(IsPlayerConnected(i)
    //Anwendung:
    for(Loop) {
    //Hier dann was passieren soll, wenn die Schleife durchläuft.
    }

    Der char "\" bedeutet, dass das Makro in einer neuen Zeile weitergeht.


    So und nun zu der letzten Verwendung für #define (die ich vorstelle es gibt natürlich noch viel mehr), wir bauen uns eine Funktion :)
    Und die machen wir ganz simpel so:
    #define Sum(%0,%1) \
    ((%0) + (%1))
    //Verwendung:
    printf("%d", Sum(1, 2));//Hier würde 3 geprintet werden
    Natürlich gibt es auch Makros die schon in einer Include Datei stehen und die wir nicht für unser Script weiter benutzen wollen und dann machen wir z.B. sowas:
    #undef MAX_PLAYERS //Hier wird das Makro entfernt
    #define MAX_PLAYERS 50 //Hier mit dem neuen Wert 50 definiert


    So nun zu den nächsten Directives:


    #if, #error, #else, #endif, #endinput
    Dieses Directive macht das selbe wie if(...) nur mit Directive Werten ^^
    Sprich:
    #define Butter 1
    #if Butter == 1
    #error Butter ist ja 1
    #endif
    Dann würde halt im Compiler der Error erscheinen durch #error, dass Butter 1 ist ^^


    Natürlich geht das noch ein wenig Komplexer:


    #define Butter 10
    #if Butter > 10 //Fragt ab ob Butter größer 10 ist
    #error Das werden wir nicht sehen//wenn ja das hier
    #elseif Butter == 9//oder wenn Butter == 9
    #error das werden wir auch nicht sehen//wenn Butter 9 wäre das hier
    #else//Wenn nicht
    #error das werden wir sehen//dann das hier
    #endif//if-Abfrage beendet


    Kommen wir nun zu einer wichtigen Verwendung im Zusammenhang mit Includes !


    #include <test>//Wir includen eine Include Datei names test
    #if defined _TEST_INC
    #endinput
    #endif
    #define _TEST_INC
    So verhindern wir, dass eine Include Datei 2x included wird ;)


    #assert
    Ja, assert ist ein schönes Directive, wenn die Bedingung nicht zutrifft, failt der Compiler und spuckt einen Fatal Error aus, sprich sowas:
    #define test 1
    #assert test > 10
    Da würde das rauskommen:


    Das waren erstmal die einfachen Directives, vielleicht werde ich ein 2. Tutorial machen für Leute, die schon etwas besser scripten können, wo ich dann auf #emit und #pragma eingehe :)


    //Edit: Hier geht es zu [ SCRIPTING ] #pragma & #emit


    mfg. :thumbup:

    Dann brauch ich aber kein enum mehr oder ?


    Natürlich brauchst du ein enum, auf welche Variablen willst du denn sonst die Werte von deiner Datenbank schreiben lassen :rolleyes:


    Das mit dem <e> kannte ich noch gar nicht, ist in der neuen Sscanf Version erst erschienen :S
    Das ist natürlich noch praktischer habe es mir gerade angeschaut, schreibe es dann einfach so:


    sscanf(Query, "p<|>e<is[24]s[64]iddd>",PlayerInfo[playerid]);


    mfg. :thumbup: