Beiträge von Kaliber

    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:

    Wozu dienen die ` ?


    Es sind Hash Codes, sie dienen zur Verschlüsselung der Daten und machen sie so vor "Hackern" sicher.
    http://de.wikipedia.org/wiki/Hashfunktion


    Danke
    Jetzt müsste ich nur noch wissen, wie man das mit der eindeutigen User-ID macht.
    Gruss
    Vince


    Dazu erstellst du eine neue Spalte in deiner MySQL-Tabelle und nennst diese id, id = Integer und klicke auf den Haken bei Auto_Increment, damit die Zahl für jeden neuen Eintrag hoch geht ;)
    und dann kannst du damit arbeiten:
    $id = mysql_query("SELECT id FROM `$tbl_name` WHERE username='$username' and password_md5='$password'");
    so und jetzt kannst du immer id verwenden, sprich sowas:
    $sql="SELECT * FROM $tbl_name WHERE id='$id'";


    mfg. :thumbup:


    Was für ein Blödsinn :wacko:


    Der Callback OnPlayerDeath wird nur dann aufgerufen, wenn ein Spieler ein Leben von 0 hat, also ist GetPlayerHealth(playerid,pHealthFake[playerid]);
    if(pHealthFake[playerid]>0)
    totaler Quatsch ^^


    Probiere es doch einfach mal so:


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid == playerid) Kick(playerid); //Das ist ein nicht richtiger Kill, er würde hier auch gekickt werden, wenn er von einer Klippe springt oder sich im Wasser ertränkt...
    return 1;
    }

    Mach deine Augen auf ob mir jemand den Befehl macht ich versteh das nicht.....


    Mach deine Augen selber auf, lPrototypel war doch so freundlich:


    ocmd:faster(playerid)
    {
    if(playerspeed == false){
    morespeed = SetTimerEx("test",1000,true,"i",playerid);
    playerspeed = true;
    SendClientMessage(playerid,-1,"Der Speedboost ist an");
    }else{
    playerspeed = false;
    SendClientMessage(playerid,-1,"Der Speedboost ist aus");
    }
    return 1;
    }
    Function test(playerid)
    {


    new Float:Pos[3];
    if(playerspeed){
    GetPlayerVelocity(playerid,Pos[0],Pos[1],Pos[2]);
    SetPlayerVelocity(playerid,floatmul(Pos[0],10.0),floatmul(Pos[1],10.0),Pos[2]);
    SetPlayerHealth(playerid,100);
    }else {
    KillTimer(morespeed);
    }
    return 1;
    }


    mfg. :pinch:

    Schau doch einfach mal im Showroom das ist ja fast das selbe :wacko:


    Ich bin gegen so eine Datenbank...ist ja okay, wenn man sich durch Beiträge inspirieren lässt, aber C&P nur noch finde ich irgendwie blöd :S


    mfg. :thumbup:

    Darauf warte ich aber schon 1-2 Wochen


    Dann ist das halt so :S


    Wenn mich nicht alles täuscht gibt es eine Funktion im Browser wo ihr euren gespeicherten Passwörter nachschauen könnt ;)


    und wenn ihr die Admins aufmerksam machen wollt, macht z.B. sowas: @Blackace


    Jetzt wird sich Blackace wenn er online kommt sich das hier anschauen :)


    mfg. :thumbup: