Hey Brotfische
Ich erkläre euch heute mal wie man ganz einfach Fraktionen erstellen kann.
Ich habe nochmal alles mit einem Kommentar kommentiert, damit ihr es auch versteht
Nun, zuerst solltet ihr euch Farben definieren, falls ihr noch keine in eurem Script habt, das geht so:
#define Blau 0x0087FFFF //Definiert die Farbe Blau,
dann bräuchtet ihr noch zwei includes, die ihr unter #include <a_samp> einfügt,
einmal ocmd und sscanf.
Das sollte so aussehen:
#include <a_samp>
#include <ocmd>
#include <sscanf>
Ihr braucht auch Spielervariablen, wofür man enum oder PVar's nimmt.
Ich benutze dafür enum's, da ich lieber mit der Funktion arbeite.
Ein neuen enum erstellt ihr mit
enum Name
{
Name1,
Name2
}
new SpielerInfo[MAX_PLAYERS][Name];
Nun zur Erklärung, mit enum erstellt ihr halt einen neuen enum mit dem Namen "Name".
Dann kommt eine geschweifte Klammer ({) , dann die Spielervariable Name1 und Name2, dann kommt halt die andere geschweifte Klammer (}).
Nun könnt ihr zbsp die Variable Name1 des Spielers auf den Wert 1 setzen:
SpielerInfo[playerid][Name1] = 1;
abfragen kann man es so:
if(SpielerInfo[playerid][Name1] == 1).
Ich erstelle nun einen Enum für den Spieler.
enum Spieler //erstellt den enum mit den Namen Spieler
{
pLeader, //Erstellt die Spielervariable pLeader
pMember, //Erstellt die Spielervariable pMember
pAdmin, //Erstellt die Spielervariable pAdmin
eingeladen
}
new sInfo[MAX_PLAYERS][Spieler]; //deklariert die Variable sInfo, [MAX_PLAYERS] steht für Spieler, also das jeder seine eigenen Variablen hat und [Spieler] für den enum Spieler
Nun wollen wir jemanden zu einem Leader machen können, dass geht so:
ocmd:makeleader(playerid,params[])
{
if(sInfo[playerid][pAdmin]>=4)
{
new frakid, pID; //Deklariert die Variablen frakid und pID
if(sscanf(params,"us",pID,frakid))return SendClientMessage(playerid,0xFF0000,"Richtige Benutzung: /makeleader [id] [frakid]"); //Falls er /makeleader unvollständig eingibt
sInfo[pID][pLeader]=frakid; //Setzt die Variable pLeader auf den Wert den man eingegeben hat.
SendClientMessage(pID,Blau,"Du wurdest Leader einer Fraktion gemacht.");
}
else //Falls er nicht das Adminlevel 4 besitzt
{
SendClientMessage(playerid,Blau,"Du hast nicht die benötigten Adminrechte!");
}
return 1;
}
Als nächstes erkläre ich euch den invite Befehl:
ocmd:invite(playerid,params[])
{
if(sInfo[playerid][pLeader]==1) //Fragt ab ob die Spielervariable pLeader den Wert 1 hat
{
new pID; //Deklariert die Variable pID
if(sscanf(params,"u",pID))return SendClientMessage(playerid,0xFF0000,"Richtige Benutzung: /invite [id]"); //Fragt ab ob der Leader den Befehl /invite vollständig eingegeben hat
SendClientMessage(pID,Blau,"Du wurdest zur Fraktion LSPD eingeladen. Benutze /annehmen um der Fraktion beizutreten.");// Sendet dem Spieler pID die Nachricht
sInfo[playerid][eingeladen]=1; //Setzt die Spielervariable "eingeladen" auf 1
}
return 1;
}
Nun brauchen wir natürlich auch einen Befehl zum annehmen
ocmd:annehmen(playerid,params[])
{
if(sInfo[playerid][eingeladen]==1) //Fragt ob die Spielervariable eingeladen den Wert 1 hat
{
sInfo[playerid][pMember]=1; //Setzt die Spielervariable pMember auf 1
SendClientMessage(playerid,Blau,"Du hast die Einladung angenommen."); // Schickt dem Spieler die Nachricht
}
/*
if(sInfo[playerid][eingeladen]==2)//Beispiel für die Abfrage für frak 2
*/
return 1;
}
Um jemanden wieder zu uninviten, brauchen wir natürlich auch wiederum einen Befehl
ocmd:uninvite(playerid,params[]) {
if(sInfo[playerid][pLeader]==1) { ////Fragt ab, ob die Variable pLeader den Wert 1 hat und führt eine Aktion aus wenn er leader ist
new pID; //Deklariert die Variable pID
if(sscanf(params,"u",pID))return SendClientMessage(playerid,0xFF0000,"Richtige Benutzung: /uninvite [id]"); // Grobe Übersetzung: Wenn sscanf im params keine spielerid/name findet returnt es... wenn doch wird der wert von pID zum wert des ersten paramenters gemacht
if(sInfo[pID][pMember] != sInfo[playerid][pLeader]) //Fragt ab ob der Spieler in der gleichen Fraktion ist
{ return SendClientMessage(playerid,Blau,"Der Spieler ist nicht in ihrer Fraktion); }
sInfo[pID][pMember]=0;//Uninvitet ihn letzendlich
}
return 1;
}
Um im LSPD intern zu schreiben, erstelle ich den Befehl "/d"
ocmd:d(playerid,params[])
{
if(sInfo[playerid][pMember]==1 || sInfo[playerid][pLeader]==1) //Fragt ab ob die Spielervariable pMember oder pLeader den Wert 1 besitzen
{
new text, //Deklariert die Variable text und name
name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
if(sscanf(params,"s",text))return SendClientMessage(playerid,0xFF0000,"Richtige Benutzung: /d [TEXT]"); //Fragt ab ob die Person "/d" vollständig eingegeben hat
for(new i = 0; i < MAX_PLAYERS; i++) //Startet eine Schleife durch alle Spieler
{
if(sInfo[i][pMember]==1 || sInfo[i][pLeader]==1) //fragt ab wer Leader oder Member des LSPD's ist
{
new string[128];
format(string,sizeof(string),"%s: %s",name,text);
SendClientMessage(i,Blau,string); //Schickt jedem Mitglied des LSPDs die Nachricht
}
}
}
return 1;
}
Damit man auch direkt in der Base spawnt, muss man im Callback OnPlayerSpawn abfragen ob die Person in der Fraktion ist:
public OnPlayerSpawn(playerid)
{
if(sInfo[playerid][pMember]==1 || sInfo[playerid][pLeader]==1) //Wenn die Spielervariable bei dem Spieler pMember oder pLeader auf 1 steht, soll dass passieren:
{
SetPlayerPos(playerid,288.745971,169.350997,1007.171875);//Den Spieler zu den Koordinaten teleportieren, die das stehen
SetPlayerInterior(playerid,3); //Den Spieler ins Interior mit der ID 3 teleportieren
}
return 1;
}
So, dass war ja nun auch schon das meiste.
Nun möchten wir aber auch noch Autos für das LSPD einfügen, das geht so:
1) Eine Variable deklarieren (Bsp: new LSPDv[2];
2) unter OnGameModeInit das Fahrzeug zu der Variable LSPDv zuzuordnen (Bsp:
LSPDv[0] = CreateVehicle(520, 2109.1763, 1503.0453, 32.2887, 82.2873, 0, 1, 60); //Erstellt ein Fahrzeug mit der ID 520 und weist es LSPDv hinzu. weswegen [0]? Weil man immer mit 0 beim zählen bei Pawn anfängt.
LSPDv[1] = CreateVehicle(520, 2109.1763, 1503.0453, 32.2887, 82.2873, 0, 1, 60); //Das gleiche wie Oben)
3) Beim einsteigen kontrollieren, ob der Spieler in der Fraktion LSPD ist:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
for(new i = 0; i < sizeof(LSPDv); i++)//erstellt eine Schleife, die überprüft ob der Spieler sich in ein Auto setzt, welches der Variable LSPDv zugewiesen wurde
{
if(newstate == PLAYER_STATE_DRIVER && GetPlayerVehicleID(playerid) == LSPDv[i])//fragt ab ob er fahrer ist und das auto LSPDv[i] ist
{
if(sInfo[playerid][pMember] == 0 || sInfo[playerid][pLeader]==0) //Fragt ob die Spielervariable pMember oder pLeader 0 ist
{
SendClientMessage(playerid,Blau,"Du bist kein Beamter der LSPD und darfst nicht mit diesem Auto fahren!"); //Schickt diese Nachricht aus
RemovePlayerFromVehicle(playerid); //Schmeisst den Spieler aus dem Fahrzeug
}
else if(sInfo[playerid][pMember]==1 || sInfo[playerid][pLeader]==1) //Fragt ob die Spielervariable pMember oder pLeader 1 ist
{
SendClientMessage(playerid,Blau,"Du hast ein Auto des LSPD betreten, fahr vorsichtig!"); //Schickt diese Nachricht aus
}
}
}
return 1;
}
So, das war nun mein kleines und erstes Tutorial.
Ich hoffe ich konnte jemanden helfen, der noch nicht wusste wie man Fraktionen scriptet.
Bewertungen und Kritik sind gerne erwünscht, mfg Skypolee