Ordnung bei den FraktionsID´s / makeleader mit namen

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

    Mein erstes eigenes Spiel


    meine Tutorials:
    Nachos Torsystem


    scripten ist kein spiel, es ist arbeit(die sehr viel spass machen kann).
    gewöhn dich an den gedanken arbeiten zu müssen oder lass es sein.

    4 Mal editiert, zuletzt von NachoMan ()

  • Ich habe ein problem bei Makeleader


    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18314) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18314) : warning 215: expression has no effect
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18315) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18318) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18318) : warning 215: expression has no effect
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18326) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18340) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18343) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18345) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18346) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18347) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18348) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18349) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18350) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18351) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18352) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18353) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18354) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18355) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18356) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18357) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18358) : error 017: undefined symbol "level"
    C:\Dokumente und Einstellungen\eno\Desktop\GTA\samp02Xserver.win32(2)\gamemodes\Dreamid.pwn(18359) : error 017: undefined symbol "level"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    21 Errors.


    und das ist der befehl
    if(strcmp(cmd, "/makeleader", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    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;
    }


    new para1;


    para1 = ReturnUser(tmp);
    tmp = strtok(cmdtext, idx);

    if(level > 14 || level < 0) { SendClientMessage(playerid, COLOR_GREY, " Dont go below number 0, or above number 14!"); return 1; }
    if (PlayerInfo[playerid][pAdmin] >= 1337)
    {
    if(IsPlayerConnected(para1))
    {
    if(para1 != INVALID_PLAYER_ID)
    {
    if(PlayerInfo[para1][pMember] > 0 || PlayerInfo[para1][pFMember] < 255)
    {
    SendClientMessage(playerid, COLOR_GREY, " That player is in a Faction / Family !");
    return 1;
    }
    GetPlayerName(para1, giveplayer, sizeof(giveplayer));
    GetPlayerName(playerid, sendername, sizeof(sendername));
    PlayerInfo[para1][pLeader] = level;
    format(string, sizeof(string), " Du Wurdest von Admin: %s zu Leader einer Family gemacht", sendername);
    SendClientMessage(para1, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), " Du Hast %s Leader von einer Family gemacht (Family ID: %d).", giveplayer,level);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    if(level == 0) { PlayerInfo[para1][pChar] = 0; }
    else if(level == 1) { PlayerInfo[para1][pChar] = 283; } //LS Polizei
    else if(level == 2) { PlayerInfo[para1][pChar] = 163; } //FBI/ATF
    else if(level == 3) { PlayerInfo[para1][pChar] = 287; } //National Guard
    else if(level == 4) { PlayerInfo[para1][pChar] = 70; } //LS MEDIC
    else if(level == 5) { PlayerInfo[para1][pChar] = 113; } //La Cosa Nostra
    else if(level == 6) { PlayerInfo[para1][pChar] = 120; } //Yakuza
    else if(level == 7) { PlayerInfo[para1][pChar] = 147; } //Mayor
    else if(level == 8) { PlayerInfo[para1][pChar] = 294; } //Hitmans
    else if(level == 9) { PlayerInfo[para1][pChar] = 227; } //News Reporters
    else if(level == 10) { PlayerInfo[para1][pChar] = 255; } //Taxi Cab Company
    else if(level == 11) { PlayerInfo[para1][pChar] = 171; } //Driving/Flying School
    else if(level == 12) { PlayerInfo[para1][pChar] = 270; } //Grouve Street
    else if(level == 13) { PlayerInfo[para1][pChar] = 288; } //SF Polizei
    else if(level == 14) { PlayerInfo[para1][pChar] = 186; }//RaceMafia
    gTeam[para1] = 15;
    PlayerInfo[para1][pTeam] = 15;
    SetPlayerSkin(para1, PlayerInfo[para1][pChar]);
    }
    }//not connected
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD1, " Du bist nicht berechtigt");
    }
    }
    return 1;
    }


    Hoffe man kann helfen

  • Ich finde die Sache nicht gut! :thumbdown:
    Unser Scripter hat das auch in stundenlanger Arbeit gemacht und jetzt haben wir den ganzen überblick verlohren...jetzt ist alles buggy und wir müssen das ganze wieder fixen...
    Meine Meinung:
    besser so lassen, wie es ist...beste Lösung
    mfg
    little_lol

  • wenn dein "scripter" es nichteinmal schafft eine sicherheitskopie zu machen, dann ist er wohl kein richtiger scripter.
    ein bisschen verstehen muss man dieses system schon, einfach copy and paste geht nicht.
    weiß nicht was dein scripter da stundenlang gemacht hat... es ist ne sache von 30minuten oder so


    ok hat alles geklabt nur jetzt verschwinden bei mir alle Objekte, und zwar wirglich alle, sogar die tore


    du hast wahrscheinlich was an der OnGameModeInit geändert und diese wird nicht mehr ganz durchlaufen.
    das passiert meistens wenn man eine endlosschleife einbaut oder ähnliches.

    Mein erstes eigenes Spiel


    meine Tutorials:
    Nachos Torsystem


    scripten ist kein spiel, es ist arbeit(die sehr viel spass machen kann).
    gewöhn dich an den gedanken arbeiten zu müssen oder lass es sein.

    Einmal editiert, zuletzt von NachoMan ()