Moin Brotfisher,
in diesem Tut möchte ich euch die Funktion Spielernamen bei Nachrichten zu verwenden näherbringen.
Vorteile:
-kommt immer besser
-es kommen nicht immer die selben Nachrichten
-man weiß wer was getan hat
Also fangen wir an.
Als erstes brauchen wir eine Variable, in der wir den Namen "speichern". Diese erstellen wir ganz einfach im CMD mit
new Name[MAX_PLAYER_NAME];
Name ist hierbei der Name der Variable
MAX_PLAYER_NAME ist eine Zahl die angibt wie lang der Name maximal in SA:MP sein kann.
Dannach brauchen wir einen String. In diesem Speichern wir die Nachricht. Den erstellen wir mit
new string[32];
string ist hierbei der Name des Strings.
[32]steht für die Länge des Strings. Dieser String kann insgesamt 32 zeichen fassen. Das Fassungsvermögen bezieht sich dabei auf die gesamte Nachricht und nicht nur den Namen. 128 Zeichen ist die Maximale Anzahl pro Nachricht im SA-MP Chatfenster.
Mehr als 32 Zeichen für einen String würde funktionieren, jedoch wäre es ab 40 unklug.
Warum? Nun ja es ist einfach Ressourcen schonender. Hier mehr dazu
Warum 40? Diese zahl habe ich nur gewählt da es über 32 ist und somit über der Maximalen Anzahl(manchmal nötig) aber trotzdem nicht zu viel ist.
Mehr zu den Strings hier.
Nun müssen wir noch irgendwie herausfinden wie den nun der Spieler heißt. Das machen wir mit
GetPlayerName(playerid,Name,sizeof(Name));
playeridsteht für den ausführenden Spieler.
Namesteht für die Variable des Namens. Wir haben sie, wie ihr hoffentlich noch wisst, "Name" gennant.
sizeof(Name) wird als "Len" im englischen Wiki angegeben. Was genau das nun heißt und was das bringt versteh ich leider nicht(Bright weiß es bestimmt). Doch Fakt ist, beim normalen gebraucht wird es so verwendet: sizeof([Name der Namensvariable]).
Mehr dazu hier
So nun kommen wir zur Nachricht. Diese geht so
format(string,sizeof(string),"Moin %s",Name);
string bezeichnet den verwendeten String. Bei uns heißt er wie oben erklärt String, bei mehreren Strings kann man ihn auch str nennen, dann würde dort eben format(str...) stehn.
sizeof(string) ist wieder mit "Len" angegeben. Wie gesagt kann ich euch dies nicht genau erklären aber es funktoniert genauso wie bei GetPlayerName(und hier weiß sicher auch Gold oder DMA weiter)
"Moin %d" ist der Text der gesendet werden soll.
"%s",Name%s ist die Variable für den Namen. Dieser ist bei uns "Name". Das heißt nach der Nachricht muss die erklärung für die Variable kommen. Bei mehreren Variablen muss dies in der richtigen Reihenfolge gemach werden. Beispiel: "%s %s %s",Name,Name2,Name3. In der Nachricht wird nun nicht "%s" stehn sondern der, von uns ausgelesene, Name.
Hier zu mehr
So nun haben wir bereits den Namen ausgelesen und die Nachricht in einem String gespeichert. Nun muss nur noch der String "gesendet" werden, so das die Spieler ihn lesen können. Das machen wir einfach mit
SendClientMessageToAll(ROT,string);
ROTsteht hier für eine Farbe die als ROT definiert sein muss
stringgibt an, dass der im String gespeicherte Text genommen wird. String muss ohne " da stehn.
So und nun haben wir einen Text mit einer Namensvariable.
Wozu kann man das verwenden?
Die Namen kann man z.B. für Join und Leave Messages verwenden, aber auch für Kick bzw Ban(Du wurdest von %s gebannt)
Eigentlich für alles wo man einen Namen erfahren sollte.
Hier ein Beispiel
dcmd_kick(playerid,paramas[])
{
new
pID,
sGrund[128];
if(sscanf(paramas, "uz",pID,sGrund))
{
return SendClientMessage(playerid,ROT,"BENUTZUNG: /kick [playerid] [Grund]");
}
if(!IsPlayerConnected(pID))
{
return SendClientMessage(playerid,ROT,"Kein Spieler mit angegebener ID online");
}
if(pInfo[playerid][Admin] >= 1)
{
new
name[MAX_PLAYER_NAME],
pname[MAX_PLAYER_NAME],
string[128];
GetPlayerName(pID,name,sizeof(name));
GetPlayerName(playerid,pname,sizeof(pname));
format(string,sizeof(string),"%s(ID: %d) wurde von %s gekickt.Grund %s",name,pID,pname,sGrund);
SendClientMessageToAll(ROT,string);
Kick(pID);
LogOut(pID);
}
else
{
SendClientMessage(playerid,ROT,"Du bist kein Admin");
}
return 1;
}
Hier haben wir sogar 3 Variablen, der Name des zu kickenden Spielers und seine ID(die muss man nicht auslesen) und den Namen des Kickers.
dcmd_allowsavespawn(playerid,paramas[])
{
if(pInfo[playerid][Admin] >= 1)
{
new pID;
if(sscanf(paramas, "u",pID))
{
return SendClientMessage(playerid,ROT,"Benutzung:/allowsavespawn [playerid]");
}
if(!IsPlayerConnected(pID))
{
return SendClientMessage(playerid,ROT,"Kein Spieler mit angegebener ID online");
}
new
name[MAX_PLAYER_NAME],
pname[MAX_PLAYER_NAME],
string[128],
str[128];
GetPlayerName(pID,name,sizeof(name));
GetPlayerName(playerid,pname,sizeof(pname));
format(string,sizeof(string),"Du hast %s(pID:%d) einen Savespawn erlaubt",name,pID);
format(str,sizeof(str),"Dir wurde vom Admin %s einen Savespawn erlaubt bekommen, mache /savespawn ein der gewünschten Position",pname);
SendClientMessage(playerid,GELB,string);
SendClientMessage(pID,GELB,str);
allowsavespawn[pID] = 1;
}
return 1;
}
Hier haben wir 2 Strings. Wie gesagt heißt der 2. String nur noch str. Das kann man endlos machen.
Warum habe ich dieses Tut geschrieben?
Ich möchte anderen helfen, da ich merke das viele Leute mit dieser "einfachen" Methode Probleme haben, ich hatte sie lange Zeit auch. Ich weiß, dieses Tut ist nicht perfekt. Ich weiß auch das Goldkiller,DMA und [NSG]Bright es hätten besser machen können und es schlecht finden werden und meckern werden, jedoch denke ich für den "Normal-Verbraucher"(=Leute wie ich) reicht es. Wir wissen nun WIE es geht, zwar nicht ganz genau warum aber ich denke zu wissen WIE reicht für den Normalverbraucher.
MfG Weed