Hallo,
Ich möchte euch gerne einige Stocks von mir vorstellen,
die ich schon eine Zeit lang nutze, mit denen ich mir so einiges
vereinfache.
Worin liegen nun die vereinfachungen? Überwiegend geht
es um die Menge des schreibens, warum 10x hintereinander den selben Code
aufschreiben, wenn man
ihn doch hübsch als Stock verpacken kann?
Sämtliche Stocks sind von mir, aber ihr dürft sie natürlich verändern und bearbeiten, also ich erhebe keinerlei Urheberrechte!
PlaySound
Als erstes gibt es den Stock: "PlaySound".
Er
erinnert sehr an den Befehl 'PlayerPlaySound' und er ist es
letztendlich auch, nur etwas präperiert . Mich hat es unheimlich
genervt, dass ich andauernd, nur um
mal einen Sound abzuspielen die
Position des Spielers erfassen muss und das raubt wertvolle Zeit, gerade
wenn man nur kurz etwas ändern will!
stock PlaySound(playerid,soundid)
{
new Float:X,Float:Y,Float:Z;
GetPlayerPos(playerid,X,Y,Z);
PlayerPlaySound(playerid,soundid,X,Y,Z);
return 1;
}
Wie
verwende ich nun diesen Stock? Einfacher geht es nun wirklich nicht,
einfach die jeweilige playerid einfügen und danach die SoundID un das
war es auch schon!
GetSpielerName
Als nächstes gibt es den Stock: "GetSpielerName"
Ganz
schnell erklärt, er gibt den Spielernamen der jeweiligen PlayerID
wieder. Dies ist gut zu verwenden, wenn man eh schon Strings formatiert
und darin gerne einen Spielernamen
einbinden möchte, weiter unten ein Beispiel dafür!
stock GetSpielerName(playerid)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
return name;
}
Mehr zauber ist da auch nicht hinter
Nun ein Beispiel zur verwendung:
new TestString[128];
format(TestString,sizeof(TestString),"Der Spieler %s möchte gerne einen Keks haben!",GetSpielerName(playerid));
Achtung! Trotz allem gibt es eine bessere Methode den selben Effekt zu erzeugen! Meine Methode stammt noch aus meinen Anfangsjahren, also solltet
ihr besser die folgende Verwenden.
Definiert ganz oben dieses:
new UserName[MAX_PLAYERS][MAX_PLAYER_NAME];
Geht als nächstes unter OnPlayerConnect und schreibt dort dieses hinein:
GetPlayerName(playerid,UserName[playerid],MAX_PLAYER_NAME);
So nun könnt ihr den Spielernamen abfragen auch ohne den oben genannten Stock. An der Stelle danke an Beavis und BlackAce!
format(TestString,sizeof(TestString),"Der Spieler %s möchte gerne einen Keks haben!",UserName[playerid]);
GivePlayerSaveWeapon
Weiter geht es mit einem etwas komplexeren Stock, der aber dafür zusätzliche Sicherheit garantiert! Dem Stock "GivePlayerSaveWeapon"
Grundgedanke
war, dass es dem durchschnittlichen Cheater/Hacker oder auch Buguser
schwerer fällt an Waffen zu kommen. Ich erkläre nun kurz das System. Waffen
werden nun nicht weiter mit GivePlayerWeapon vergeben, sondern ab nun
mit diesem Stock! Das einzige das ihr dafür tun müsst, ist:
GivePlayerSaveWeapon//anstatt
GivePlayerWeapon
Hier nun der fertige Stock, aber achtung, es gehört noch mehr dazu, sonst erlebt ihr später eine Böse Überraschung!
stock GivePlayerSaveWeapon(playerid,weaponid,ammo)
{
GivePlayerWeapon(playerid,weaponid,ammo);
SetPVarInt(playerid,"SaveWeapon",1);
return 1;
}
Hier
wird lediglich dem Spieler die Waffe mit der gewünschten Munition
gegeben. Außerdem wird die PVar "SaveWeapon" auf 1 gesetzt, damit hat
der Spieler die Erlaubnis eine Waffe
zu besitzen! Nun möchte man noch, dass der Spieler gekickt wird, wenn er trotz der fehlenden Erlaubnis eine Waffe bekommt!
Dieses hier am besten unter "OnPlayerUpdate"!
if(GetPlayerWeapon(playerid)!=0)
{
if(GetPVarInt(playerid,"SaveWeapon")!=1)return Kick(playerid);
return 1;
}
Der
Spieler sollte auf jeden Fall nur gekickt oder entwaffnet werden. Denn
es können immer wieder Bugs oder Fehler auftreten und dann ist ein
Spieler zu unrecht gebannt!
Nun muss noch unbedingt unter
"OnPlayerDeath" oder auch an jede Stelle, an der der Spieler seine
Waffen entzogen bekommt, beispielsweise durch "ResetWeapons", die PVar
wieder auf 0 gesetzt werden!
SetPVarInt(playerid,"SaveWeapon",0);
Achtung!
Ihr solltet auf jeden Fall das ganze Script überprüfen, ob ihr nicht
doch noch irgendwo GivePlayerWeapon anstatt GivePlayerSaveWeapon gesetzt
habt. Hier kann
die Replacefuntkion Abhilfe schaffen! Außerdem solltet ihr die gesamten Codes noch etws anpassen!
MeAction
Der
Nächste Stock ist eine kleine Erleichterung für alle, die ein Reallife
Script oder ähnliches betreiben. Hier fügen wir eine komplett neue
Funtkion mithilfe eines Stock ein,
nämlich "MeAction"!
Es
Hilft wirklich sehr, man möchte ja einerseits nicht, dass man andauernd
diese langen Codezeilen an jeder Stelle hat und andererseits nervt es
wirklich andauernd das
selbe Tippen zu müssen^^. Mit MeAction wird
eine Nachricht vom Spieler an alle, die sich in einem bestimmten Umkreis
vom Spieler befinden, gesendet.
stock MeAction(playerid,msg[])
{
new Float:X,Float:Y,Float:Z,meactstring[350];
GetPlayerPos(playerid,X,Y,Z);
format(meactstring,sizeof(meactstring),"* %s %s",GetSpielerName(playerid),msg);
PlaySound(playerid,1138);
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerInRangeOfPoint(i,20,X,Y,Z))//ggf. die Range (hier im Falle die 20) anpassen!
{
SendClientMessage(i,0xFF00E1FF,meactstring);
}
}
return 1;
}
Nun
wird diese Nachricht in einem wunderschönen Lilaton, der gar nicht
stört^^, an alle Spieler geschickt, die sich in einem Umkreis von 20 San
Andreas Einheiten um ihn befinden.
Ihr musst dann noch lediglich an die entsprechenden Stellen dies einfügen:
MeAction(playreid,"beginnt zu husten");
der Output sähe dann so aus!
* [Spielername] beginnt zu husten
Ich hoffe ich konnte euch einige Stocks schmackhaft machen, danke für das Lesen des Threads
MfG KTP