Heyho Leute,
ich will euch heute mal Zeigen wie ihr ein Namechange macht mit einem Befehl und einem Admin Befehl der dem Spieler erlaubt den Namen zu ändern viel Spaß beim Lesen
Anfang:
So was brauchen wir für das?
- SSCANF Stock Function
- ocmd | dcmd | rcmd | Was auch immer
- Grundkenntnisse
Script:
Fangen wir an wir brauchen als erstes Globale variablen
nähmlich player Variablen
die so aussehen
new variable[MAX_PLAYERS];
Wie rufen wir das ganze dann auf?
if(variable[playerid]==wert)
Setzen tun wir es mit
variable[playerid]=wert;
Aber da wir in so einer Variable ein String speichern werden brauchen wir noch eine Zeichenkette
Das machen wir so
new namechange[MAX_PLAYER_NAME][MAX_PLAYERS];
und
new dontnamechange[MAX_PLAYERS];
Das natürlich über OnGameModeInit da wir dies Global benötigen!
So wir haben nun eine Variable die aber noch leer ist wie füllen wir sie?
Wir machen jetzt unersen Befehl
ocmd:namechange(playerid,params[])// Das sollte sich von alleine klären ansonsten playeridid gibt den spieler also die id zurück und params die parameter
ocmd:namechange(playerid,params[])//unser befehl
{
new name[MAX_PLAYER_NAME],name2[MAX_PLAYER_NAME],str[128],astr[128]; //Die Variablen Local name2 für den input name um herauszufinden wie er heißt und der str zum formatieren und eine nachricht zu senden
GetPlayerName(playerid,name,sizeof(name));//frägt den namen von playerid ab und gibt ihn dir zurück
if(sscanf(params,"s",name2)) return SendClientMessage(playerid,-1,"SYNTAX: /namechange [NAME]");//Parameter überprüfung
if(dontnamechange[playerid]==1) return SendClientMessage(playerid,-1,"Du hast schon ein Namechange angefordert! Warte auf ein Admin! Oder beende den Namechange! Mit /cnc"); //abfrage ob er evtl. schon ein namechange hat bzw. angefordert hat
if(name2>MAX_PLAYER_NAME)return SendClientMessage(playerid,-1,"Der Name ist zu lang!");//Überprüfung ob der name der länge von MAX_PLAYER_NAME stimmt wenn nicht wird die nachricht returnt
format(astr,sizeof(astr),"[NAMECHANGE]: Der Spieler %s hat ein Namechange angefordert er will nun %s heißen! /acceptnamechange [ID] um ihm das zu erlauben!",name,name2);
for(new i; i=0; I<MAX_PLAYERS; i++)//eine for schleife die durch alle players geht
{
if(IsPlayerConnected(i))// überprüfen ob i connected ist
{
if(IsPlayerAdmin(i))//Abfrage ob i rcon admin ist
{
SendClientMessage(i,-1,astr);//Senden nun den astr an alle i bzw. die im Rcon sind!
}
}
}
namechange[playerid]==name2;//Setzen und den namechange wert auf den input
dontnamechange[playerid]=1;//setten die variable damit er nicht nochmal ein namechange anfordert
format(str,sizeof(str),"Du hast ein Antrag auf ein Namechange abgesendet warte bis ein Admin ihn akzeptiert! Name: %s",name2);//Hier wird der string formatiert
SendClientMessage(playerid,str);//Erklärt sich von selbst!
}
So das ist der Befehl um einen Namechange anzufodern! (Hab paar Fehler eingebaut die ich oben beschrieben habe wie man was zuweist damit hier nicht so viel C&P betrieben wird!)
So wie erwähnt solltet ihr eine Nachricht an einen Admin senden am besten mit dem Inhalt wie den Namechange namen... etc.
Kommen wir zum cnc befehl!
ocmd:cnc(playerid,params[])
{
new astr[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
if(dontnamechange!=1)return SendClientMessage(playerid,-1,"Du hast kein Namechange angefordert somit kannst du keinen Abbrechen!");//abfrage ob er überhaupt ein namechange angefordert hat
SendClientMessage(playerid,-1,"Du hast den Namechange request abbgebrochen!");//Geben ihm die nachricht das er es abgebrochen hat
format(astr,sizeof(astr),"Der Spieler %s[ID:%d] hat den Namechange antrag abbgebrochen du brauchst ihn nicht mehr annzunehmen!",name,playerid);//geben den format das der spieler %s mit der id %d(playerid) den Namechange doch nicht will!
for(new i; i=0; I<MAX_PLAYERS; i++)//eine for schleife die durch alle players geht
{
if(IsPlayerConnected(i))// überprüfen ob i connected ist
{
if(IsPlayerAdmin(i))//Abfrage ob i rcon admin ist
{
SendClientMessage(i,-1,astr);//Senden nun den astr an alle i bzw. die im Rcon sind!
}
}
}
dontnamechange=0;//setzen die variable wieder auf 0 damit er wieder einen namechange anfordern kann.
return 1;
}
Kommen wir zum Befehl
ocmd:acceptnamechange(playerid,params[])
{
new pID,str[128],name[MAX_PLAYER_NAME];//variablen (local)
GetPlayerName(playerid,name,sizeof(name));//frägt den namen von playerid ab
if(!IsPlayerAdmin(playerid)) return 0;//rcon admin abfrage
if(sscanf(params,"u",pID)) return SendClientMessage(playerid,-1,"SYNTAX: /acceptnamechange [ID/NAME]"); //sscanf abfrage
if(dontnamechange[pID]==0)return SendClientMessage(playerid,-1,"Dieser Spieler hat kein Namechange angefordert!"); //Abfrage ob der Spieler ein namechange angefordert hat?
format(str,sizeof(str),"Der Spieler %s heißt nun %s !",name,namechange[pID]);//formatierung vom string
SendClientMessageToAll(str);//Hier wird an alle verbundenen clients der string gesendet!
dontnamechange[pID]==0;//variable auf 0 da er sein namechange bekommt
SetPlayerName(pID,namechange[playerid]);//Name wird auf den wer namechange[playerid] gesetzt!
return 1;
}(Wieder paar fehler eingebaut!)
So kurze zussammenfassung:
Sobald ein Spieler den Befehl /namechange NAME macht wird eine Nachricht an einen Admin gesendet mir eurem Inhalt sobald der Admin /acceptnamechange ID/NAME eingibt wird der name auf den variablen wert geändert!
MFG
Danke fürs Lesen!