Beiträge von NachoMan

    lern bloss nicht nur c! das ist verschwendete zeit und du lernst völlig falsche techniken die du bei c++ nicht anwenden solltest.


    ich bin absolut begeistert von diesem buch.


    damit lernst du objektorientiert zu schreiben und wirst dir wohl bei den meisten posts hier an den kopf fassen.


    natürlich ist mit pawno nicht das möglich was mit c++ möglich ist (keine klassen usw.)


    ausserdem bist du wenn du das buch gelesen hast durchaus in der lage einfache eigene spiele zu programmieren und mit nem weiteren, etwas dickeren buch kannsu schon viel mehr. (logisches denkvermögen und motivation vorrausgesetzt)

    bitte nur für erfahrene Scripter
    Einführung:


    Hallo und Willkommen in Nachos erstem Tutorial!


    In meinem Code steht immer die Erweiterbarkeit und Übersichtlichkeit im Vordergrund.


    Dazu gehört, dass man Objekte (damit meine ich Dinge in der Spielwelt, z.B. Fraktionen, Autos, Tore) zentral erstellt. Diese somit einfach einfügen und ändern kann, ohne den ganzen Code zu ändern.


    Als Beispiel dienen uns erstmal die Fraktionen.


    Ich habe GTA-SA:MP mit der Godfathermode kennen gelernt, wo jede Fraktion eine feste ID hat.
    LSPD z.B. hat die 1, die Yakuza 6, FBI 2 und so weiter.


    Einer meiner ersten Aufträge war neue Fraktionen einzubauen. Das war nicht so einfach, denn wenn ich z.B. nach dem LSPD noch das SFPD gesetzt habe, haben sich alle IDs verschoben, ich wollte das SPFD, aus Gründen der Ordnung, nicht ans Ende stellen.


    Die Lösung(ein Makro) gehört an den Anfang des Codes und kann später einfach geändert werden:
    #define ZIVIL 0


    #define LSPD 1
    #define FBI 2
    #define ARMY 3


    und so weiter. Wir brauchen später vllt noch die Anzahl der Fraktionen:


    #define NUMFRACTIONS 4


    Wenn wir #define benutzen, dann wird vor dem eigentlichen Compilieren, die erste Zeichenkette durch die zweite ersetzt. Aus ARMY wird also 3 (Jeder Befehl der mit # beginnt ist eine sogenannte Präprozessordirektive und wird immer VOR dem Compilieren ausgeführt.)


    Um das in den Game-Mode(hier GF) einzubauen, müssen wir im ganzen Quellcode nach stellen suchen,
    an denen Fraktionen abgefragt werden.
    Dafür benutzt du am Besten die Suchfunktion und sucht einmal nach pLeader und ersetzt dann die
    zu vergleichende Zahl durch das dazugehörige Makro.
    Wenn das erledigt ist suchst du nach pMember...


    1 durch "LSPD" ersetzen, 2 durch "FBI"...


    zum Beispiel machen wir aus:
    public IsACop(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    new leader = PlayerInfo[playerid][pLeader];
    new member = PlayerInfo[playerid][pMember];
    if(member==1 || member==2 || member==3)
    {
    return 1;
    }
    else if(leader==1 || leader==2 || leader==3)
    {
    return 1;
    }
    }
    return 0;
    }
    ganz einfach:
    public IsACop(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    new leader = PlayerInfo[playerid][pLeader];
    new member = PlayerInfo[playerid][pMember];
    if(member==LSPD || member==FBI || member==ARMY)
    {
    return 1;
    }
    else if(leader==LSPD || leader==FBI || leader==ARMY)
    {
    return 1;
    }
    }
    return 0;
    }
    Wenn ich jetzt ein LSPD einbauen will, brauch ich nur die Aufzählung am Anfang ändern.
    #define ZIVIL 0


    #define SFPD 1
    #define LSPD 2
    #define FBI 3
    #define ARMY 4


    #define NUMFRACTIONS 5
    und da die SFPD der Polizei angehört müssen wir auch die Funktion etwas umändern,
    public IsACop(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    new leader = PlayerInfo[playerid][pLeader];
    new member = PlayerInfo[playerid][pMember];
    if(member==LSPD || member==SFPD || member==FBI || member==ARMY)
    {
    return 1;
    }
    else if(leader==LSPD || leader==SFPD || leader==FBI || leader==ARMY)
    {
    return 1;
    }
    }
    return 0;
    }


    Um zur Laufzeit auf die Makros zu greifen zu können müssen wir ein Array mit den Fraktionnamen erstellen.
    new FractionNames[NUMFRACTIONS][30] = {
    {"ZIVIL"}, // 0


    {"SFPD"}, // 1
    {"LSPD"}, // 2
    {"FBI"}, // 3
    {"ARMY"}, // 4
    };
    Dieses Array benötigt man zum Beispiel beim "/makeleader" Befehl.


    Dafür machen wir aus:
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "USAGE: /makeleader [playerid/PartOfName] [Fraktions ID]");
    return 1;
    }
    level = strval(tmp);
    einfach:
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "USAGE: /makeleader [playerid/PartOfName] [Fraktionsname]");
    return 1;
    }
    level = NUMFRACTIONS;
    for(new x = 0; x < sizeof(FractionNames) && level == NUMFRACTIONS; x++)
    {
    if(strcmp(tmp, FractionNames[x], true) == 0)
    level = x;
    }
    }
    Hier werden die Fraktionsnamen mit der eingabe überprüft und die richtige ID abgespeichert.


    Schleifen, die die Fraktionen durchlaufen, funktionieren natürlich trotzdem!


    Das klingt vielleicht nach unnötiger Arbeit, sobald du aber eine neue Fraktion einbauen willst, wirst du es dir danken. Ich hoffe, du hast alles verstanden und bitte dich um konstruktive Kritik.


    Danke für deine Aufmerksamkeit, bis zum nächsten Mal!


    Mehr Tutorials gibt es, und wird es noch auf meiner HP(siehe Signatur) geben.

    jetzt, nachdem ich meiner freundin das system erklärt habe ist mir aufgefallen, dass man bei dir fast nur gewinnen kann.
    du solltest entweder überprüfen ob der spieler in der letzten zeit schon lotto gespielt hat oder einstellen, dass er eher was verliert als gewinnt.


    an stelle des spielers würd ich mit /lotto auf 1 legen und 1000mal 1 drücken, dann hätte ich total viel kohle und würde den server verlassen und mir nen anderen suchen, weil es dann kein sinn mehr macht zu spielen.

    zu Punkt 6, art 1, zeile 15: Leider funktioniert das nur so lange bis du ein Spieler in mitten der Tabelle löschst.
    Wenn du ALLE Spieler laden willst, dann benutzt lieber:

    format(sql, sizeof(sql), "SELECT * FROM Player LIMIT %d, 1", i);


    sonst ein super Tutorial, dankeschön!

    vorschlag von mir:


    if(strcmp("/lotto", cmdtext, true, 10) == 0)
    {
    new string[128];
    new lotto = random (500);
    lotto -= 275;
    if(lotto > 0){
    format(string, sizeof(string), "Herzlichen glückwunsch, du hast %d$ gewonnen.", lotto);
    }
    else if(lotto < 0)
    {
    format(string, sizeof(string), "Schade, du hast %d$ verloren.", lotto * -1);
    }
    else
    {
    format(string, sizeof(string), "du hast weder gewonnen noch verloren, versuchs nochmal!");
    }


    SendClientMessage(playerid, COLOR_GREEN, string);
    GivePlayerMoney(playerid, lotto); // du bekommst das geld
    return 1;
    }