Automatischer OOC Chat
Tutorial
Tutorial
Hallo alle zusammen,
da ich heute ein bisschen im Thread Tutorialwünsche mich ein bisschen umgesehen,
entdeckte ich, dass ein gewisser User nach dem oben genannten gesucht hat/sucht. ( @ScripterAkaMapper: !)
Falls er es nicht mehr benötigt ist das auch egal, da ich hier noch nicht so was gesehen habe.
Aufbau des OOC Chats:
- mithilfe von dem Befehl /o [Text] können User/Admins globale Nachrichten, die also jeder auf dem Server lesen kann, verschicken
- Der OOC Chat schaltet sich bei einer niedrigeren Playerzahl als 25 User aus. D.h. man kann dann keine Nachrichten mehr per /o verschicken. (Außer Admins)
Ist ziemlich simpel aufgebaut, ihr könnt natürlich alles erweitern und 'dynamischer' gestalten, jedoch erkläre ich hier nur das nötigste.
Was ihr braucht:
- Ein kleines bisschen Kenntnisse in PAWN
- OCMD + Sccanf2 Plugin oder Stock. Natürlich könnt ihr auch DCMD,ZCMD oder gleich das mit strcmp realisieren.
- Ein kleines bisschen Geduld
- Lernbereitschaft
So weit so gut fangen wir doch einfach mal an.
Zuerst scrollen wir in unserem PAWN Editor mal ganz nach oben und deklarieren uns eine neue globale Variable vom Variablentypen boolean.
Wir nehmen hier 'nur' ein Boolean, da wir für die Abfrage, ob der Chat an/aus ist nur 'true' oder 'false' benötigen, alles andere wäre Verschwendung, da
das Boolean am wenigsten an Ressourcen verbaucht.
[pwn]new bool:OOCStatus = true;[/pwn]
So nun ist das mit der Variable erledigt. Übrigens wir brauchen hier kein MAX_PLAYERS oder so hintendran, da die Meldung ja universell
für alle Spieler gilt und nicht nur für jeden einzelnen ;)
Wir definieren diese Variable aber gleich mit dem Wert true, da der OOC Chat standardmäßig immer an ist.
So nun erstellen wir uns nun den /O Befehl mit dem der Spieler Nachrichten an alle verschicken soll.
Irgendwo im Script, wenn wir mit OCMD jedenfalls arbeiten, schreiben wir uns schon mal unser Befehlsgrundgerüst.
[pwn]ocmd:o(playerid,params[])
{
return 1;
}[/pwn]
Der Befehl übergibt im folgenden Code Statement die Parameter playerid ( der Spieler der den Befehl eingibt)
und params ( die Parameter die evtl. nach dem Befehl eingegeben werden). In die eckigen Klammern nach params
schreiben wir nichts herein, da dies ein Platzhalter für diese ist.
Das return 1; gibt bloß an, dass wenn der Befehl abgeschickt wird, nicht 'Server: Unknown Command' ausgegeben wird und damit zu return 1;
ins Callback OnPlayerCommandText "hinunterrast".
Als aller erstes kommt die sscanf Parameter Abfrage hinzu, die überprüft, ob der Spieler nicht einen falschen Variablentypen oder überhaupt nichts nach
dem Befehl eingegeben hat:
[pwn]if(sscanf(params,"s",msg))return SendClientMessage(playerid,FARBE,"/o [Text]");[/pwn]
Mit if(sscanf( ... )
fragen wir ab ob nach den parametern ein String NICHT eingegeben wurde, dann unterbrechen wir den Code und schicken ihm die "Error Meldung".
So wir bauen uns unseren Befehl aus und schreiben hinzu:
[pwn]new msg[128];
if(IsPlayerAdmin(playerid))
{
format(msg,sizeof msg,"(( %s: %s ))",SpielerName(playerid),msg);
SendClietMessageToAll(DEINEFARBE,msg);
}[/pwn]
if(IsPlayerAdmin(playerid))
{
format(msg,sizeof msg,"(( %s: %s ))",SpielerName(playerid),msg);
SendClietMessageToAll(DEINEFARBE,msg);
}[/pwn]
So schauen wir uns das mal ein bisschen genauer an.
Wir deklarieren zuerst eine lokale Variable vom Typ String, in der Text, der nach dem Befehl eingegeben wird, gespeichert wird
Die 128 gibt einzig und allein die max. Buchstabenlänge an, also wie lang der String max. sein darf.
mit if(IsPlayerAdmin(playerid)) fragen wir ab, ob der Spieler als RCON-Admin eingeloggt ist, hier könnt ihr auch eure Admin Abfrage ergänzen,
und formatieren mit format unseren String auf ein bestimmtes format. %s: %s steht für zwei Platzhalter
für Zeichenketten, die dann danach mit dem Inhalt von 'SpielerName(playerid)' und 'msg' versehen werden.
Mit der Funktion SendClientMessageToAll(FARBE,NACHRICHT) wird eine Nachricht an alle Spieler verschickt.
(Admins sollen ja auch bei geschlossenem OOC Chat noch schreiben können)
Wer die Funktion SpielerName(playerid) noch nicht besitzt, kann diese gerne hinzufügen.
[pwn]stock SpielerName(playerid)
{
new Name[MAX_PLAYER_NAME+1];
GetPlayerName(playerid,Name,sizeof Name);
return Name;
}[/pwn]
{
new Name[MAX_PLAYER_NAME+1];
GetPlayerName(playerid,Name,sizeof Name);
return Name;
}[/pwn]
Ich denke, dass obige Funktion jeder versteht.
So weiter mit unserem Befehl:
[pwn]else
{
if(OOCStatus == true)
{
format(msg,sizeof msg,"(( %s: %s ))",SpielerName(playerid),msg);
SendClientMessageToAll(DEINEFARBE,msg);
}
else
SendClientMessage(playerid,FARBE,"OOC Chat ist zurzeit geschlossen.");
}[/pwn]
{
if(OOCStatus == true)
{
format(msg,sizeof msg,"(( %s: %s ))",SpielerName(playerid),msg);
SendClientMessageToAll(DEINEFARBE,msg);
}
else
SendClientMessage(playerid,FARBE,"OOC Chat ist zurzeit geschlossen.");
}[/pwn]
Mit else sagen wir dem Script, dass wenn der Spieler unsere Bedingung IsPlayerAdmin nicht erfüllt hat,
also kein Admin ist, soll dieser Block ausgeführt werden.
Dann fragen wir noch mit einfachen if Abfragen ab, ob die Variable OOC Status auf true ist, soll er Nachrichten senden können, wenn aber nicht,
soll er keine Nachricht schreiben können.
Jetzt haben wir ja schon fast alles, jedoch soll ja jetzt der Chat noch automatisch geschlossen werden, bei einer Spielerzahl von kleiner als 25.
Dazu gehen wir zu dem Callback OnGameModeInit() und erstellen uns dort einen Timer:
[pwn]SetTimer("UpdateOOC",10000,true);[/pwn]
Zur Syntax von SetTimer:
UpdateOOC ist die Funktion, die aufgerufen werden soll.
Die 10000, bedeutet 10 Sekunden. Nach 10 Sekunden nach dem Start der Server Konsole soll der Timer ausgeführt werden.
true bedeutet hier nur, dass er sich danach wieder wiederholen soll. false würde das Gegenteil bedeuten.
Wir müssen jedoch unsere Funktion "UpdateOOC" noch forwarden, das machen wir ganz oben im Script.
[pwn]forward UpdateOOC();[/pwn]
Die Klammern können wir hier wieder schließen, da keine Parameter übergeben werden sollen.
So, Nun haben wir unsere Funktion 'forwarded' jetzt erstellen wir diese ganz unten im Skript:
[pwn]public UpdateOOC()
{
return 1;
}[/pwn]
{
return 1;
}[/pwn]
Wichtig ist es hier, keinen stock statt public zu schreiben, da SetTimer einen "Public" benötigt.
'Publics' oder 'Timercallbacks' müssen daher immer geforwarded werden.
Hier schreiben wir nun rein, dass der OOC Chat bei weniger als 25 Spielern geschlossen werden soll.
Dazu erstellen wir uns eine For Schleife, die alle Spieler durchläuft.
[pwn]new count=0;
for(new i=0;i<GetMaxPlayers();i++) {
if(IsPlayerConnected(i) && !IsPlayerNPC(i)) {
count++;
}
}
if(count < 25) {
OOCStatus = false;
SendClientMessageToAll(FARBE,"OOC Chat wurde automatisch geschlossen!");
}[/pwn]
for(new i=0;i<GetMaxPlayers();i++) {
if(IsPlayerConnected(i) && !IsPlayerNPC(i)) {
count++;
}
}
if(count < 25) {
OOCStatus = false;
SendClientMessageToAll(FARBE,"OOC Chat wurde automatisch geschlossen!");
}[/pwn]
Aber zuerst erstellen wir uns noch eine Variable "count", die wie schon der Name sagt, die Spieler zählen soll.
Mit der For Schleife durchlaufen wir alle Spieler und, falls der Spieler, der gerade durchlaufen wird, verbunden ist und gleichzeitig ( durch das &&) kein NPC ist
wird die Variable count mit ++ um eins erhöht.
Dann wenn die Schleife zuende ist wird abgefragt ob die Variable count, die alle Spieler davor gezählt hat, kleiner als 25 ( mit < ) ist,
wenn ja wir die Variable OOCStatus auf false gesetzt und nun kann der normale Spieler nichts mehr schreiben.
So ich glaube damit ist der Scriptingteil auch vorbei.
Wenn ich etwas vergessen habe oder einen Fehler eingebaut habe, scheut euch nicht, mir dies zu melden.
Ich würde mich sehr über Feedback oder Bewertungen freuen.
Mit Freundlichen Grüßen
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Logan_Adams ()