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 ![]()
