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.