Hallo ihr Breadfische,
da ich mir schon viele Tutorials angeguckt habe, und mir 90% auch weiter geholfen haben, möchte ich mein Wissen auch teilen.
In diesem (meinem ersten) Tutorial zeige ich euch wie ihr ein Restart Befehl (z.B. /srestart) mit einem Grund erstellt. Am Ende soll es dann z.B. so aussehen:
[SERVER]: Achtung! Der Server wird in 3 Minuten automatisch Restarten! Grund: ...
PS: Dieses Tutorial ist für neue Pawno Anfänger. Ich weiß man könnte den Befehl noch mit selbst bestimmter Zeit etc machen,
aber ich hab mich dafür entschieden.
Was ihr braucht?
- Ein bisschen Zeit
- Verständnis
- Pawno
- Lust und Laune
Gut dann fangen wir mal an...
Als erstes erstellen wir eine Variable ganz oben im Script. Warum die Variable? Wir wollen, dass wenn jemand den Befehl eintippt
der Vorgang gestartet wird. Wird der Befehl erneut vor dem Restart eingetippt werden doppelte Nachrichten verschickt etc. Und das
wollen wir nicht. Deswegen geht ihr ganz nach oben ins Script und macht folgendes hin:
new RestartS;
Gut, das hätten wir. Manche Fragen sich jetzt bestimmt warum kein: new RestartS[MAX_PLAYERS];? Aus dem Grund, weil die Variable
für den ganzen Server gelten soll. Würden wir MAX_PLAYERS eingeben, würde die Variable nur für den bestimmten Spieler auf 1 springen, was heißt:
Die nächsten könnten auch alle den Befehl eingeben und der Server wird zu gespammt. Wenn wir jetzt nur für den Server setzen kann nur
einer den Befehl machen, sodass die Variable auf 1 gesetzt wird.
So, nun haben wir die Variable, jetzt geht's auf zum Befehl der wie folgt lautet:
if(strcmp(cmd, "/srestart", true) == 0)
{
if(IsPlayerConnected(playerid))
{
if(PlayerInfo[playerid][pAdmin] >= 6)
{
if(Restarts == 0)
{
ShowPlayerDialog(playerid,SRESTART,DIALOG_STYLE_INPUT,"Server Restart","Bitte gebe den Grund des Server Restarts ein.\n(Achtung: Die Nachricht kann jeder lesen!)","Starten","Abbrechen");
}
else if(Restarts == 1)
{
SendClientMessage(playerid,COLOR_GRAD1,"Es wurde bereits ein Serverrestart gestartet!");
}
}
else
{
SendClientMessage(playerid,COLOR_GRAD1,"Du besitzt nicht die benötigten Rechte dafür!");
}
}
return 1;
}
Das ist nun unser Befehl, wie ihr sehen könnt habe ich das für ein GF gescriptet.
Wenn ihr ein Selfmade habt, ändert ihr einfach die Abfragen in eure um.
Was heißen nun alle diese Abfragen?
if(IsPlayerConnected(playerid))
Das Fragt ab, ob der Spieler eingeloggt ist (GF)
if(PlayerInfo[playerid][pAdmin] >= 6)
Das Fragt ab, ob der Spieler der diesen Befehl eingibt auch ein Admin ist, der einen höheren Rang als 6 hat. ( >= 6)(GF)
Doch was heißt nun dieses "else"?
Das "else" bedeutet wenn der Spieler den Bedingungen nicht nachkommt soll das und das passieren. In unserem Fall:
SendClientMessage(playerid,COLOR_GRAD1,"Du besitzt nicht die benötigten Rechte dafür!");
Nun kommen wir zu unserer Variable. Die Abfrage lautet folgender maßen:
if(Restarts == 0)
Das heißt, wenn die Variable auf 0 gesetzt ist, also kein Restart gestartet wurde, zeigt er den Dialog an.
Die "else" Abfrage dadrunter verhindert den erneuten Start, sollte jemand schon den Befehl eingegeben haben wird die Nachricht gesendet:
SendClientMessage(playerid,COLOR_GRAD1,"Es wurde bereits ein Serverrestart gestartet!");
Wenn also noch kein Restart gestartet wurde, soll uns das Script das Dialog zeigen:
ShowPlayerDialog(playerid,SRESTART,DIALOG_STYLE_INPUT,"Server Restart","Bitte gebe den Grund des Server Restarts ein.\n(Achtung: Die Nachricht kann jeder lesen!)","Starten","Abbrechen");
Das ist unser Dialog wo wir später den Grund eintippen für unseren Server Restart. Dazu nehmen wir den DIALOG_STYLE_INPUT. Beim INPUT hat man
dann die freie Zeile wo man dann beliebiges rein schreiben kann. Der Name des Dialoges lautet "SRESTART", was wir auch oben definieren müssen.
Deswegen geht ihr nochmal ganz oben ins Script und macht:
#define SRESTART Zahl
Warum steht da jetzt Zahl? Da die meisten schon ein paar Dialoge haben müsst ihr die entsprechende Zahl eintragen. Das heißt, wenn ihr ein Dialog mit z.B.
#define DIALOG_REPORT 1
habt, müsst ihr um eins erhöhen, nämlich:
#define SRESTART 2
Das oben ist nur ein Beispiel, bei jedem ist es anders!
Wenn ihr noch mehr Fragen zu Dialogen habt: http://wiki.sa-mp.com/wiki/ShowPlayerDialog
So nun haben wir unseren schönen Dialog definiert. Jetzt fehlt eigentlich nur die Funktion des Dialoges.
Dafür gehen wir zu OnDialogResponse und fügen folgendes ein:
if(dialogid == SRESTART)
{
if(response == 0)
{
return 1;
}
if(response == 1)
{
new string[128];
SendClientMessage(playerid,COLOR_GREEN,"Der Serverrestart wurde erfolgreich gestartet!");
format(string,sizeof(string),"[Server]: Der Server startet in 2 Minuten automatisch neu! Grund: %s",inputtext);
SendClientMessageToAll(COLOR_RED,string);
Restarts = 1;
SetTimerEx("Srestart",120000,false,"i",playerid);
}
}
Was heißen denn nun wieder die Abfragen?
if(dialogid == SRESTART)
Diese Abfrage kommt immer am Anfang, denn die fragt ab ist es dieser Dialog. In diesem Fall, ist es der Dialog SRESTART wird
folgende Funktion ausgeführt.
if(response == 0)
Das ist der erste Button bei unserem Dialog oben. Response 0 ist immer der letzte Button, in diesem Falle der "Abbrechen" Button.
if(response == 1)
Das ist unser erste Button, nämlich der "Starten" Button.
Also wenn der Spieler den Button "Abbrechen" drückt, schließt sich der Dialog, wenn der Spieler aber auf
"Starten" drückt, wird das ausgeführt was dort hinein geschrieben wurde.
Der Spieler bekommt eine Nachricht und es kommt eine Nachricht an den ganzen Server.
Die Variable wird auch auf 1 gesetzt, damit er nicht mehrmals gestartet wird.
Nun sehen wir auch einen Timer, aber zu dem kommen wir gleich, wer sich noch nicht so gut mit Timern auskennt:
Nun Fragen sie ein paar was dieser "inputtext" am Ende bedeutet:
format(string,sizeof(string),"[Server]: Der Server startet in 2 Minuten automatisch neu! Grund: %s",inputtext);
Der "inputtext" ist das was der Spieler beim Dialog eingibt, und wir mit diesem Befehl wiedergeben.
Der eingegebene Text wird bei "%s" angezeigt.
So, nun wo das erklärt ist kommen wir zum Timer. Damit der Timer auch funktioniert müssen wir ihm eine Funktion zuteilen.
Ales erstes gehen wir nochmal ganz oben ins Script und fügen folgendes ein:
forward Srestart ();
Nach dem wir das gemacht haben, können wir unten einen "public" erstellen.
Der wie folgt aufgebaut ist:
public Srestart()
{
SendRconCommand("gmx");
return 1;
}
Merke: Bei einem public oder einer Abfrage muss kein ";" hinten dran!
So nun wird der RconCommand "gmx" (Restart Server) an den Server geschickt, danach startet er automatisch.
Ihr könnt mit dem gleichen verfahren andere Befehle ausführen lassen.
So nun ist unser Befehl fertig, der Server restartet nach 2 Minuten automatisch. Die Zeit könnt ihr beliebig ändern bei:
SetTimerEx("Srestart",120000,false,"i",playerid);
1000 = 1 Sekunde
60.000 = 60 Sekunden
120.000 = 120 Sekunden
.
.
.
Was nützt mir der Befehl?
- Die User sind über einen Restart informiert
- Man muss das Spiel nicht neu starten
(Da man danach wieder sich einloggen kann)
- Script Updates etc werden übernommen
Ich hoffe ich konnte euch was beibringen. Mein Rat an euch, durch Copy und Paste lernt ihr nichts. Last euch Zeit!
Über Verbesserungsvorschläge, Antworten oder PN's würde ich mich freuen.
Es würde mich ebenfalls freuen wenn ihr mir Vorschläge für die nächsten Neulings Tutorial macht.
Wenn ihr Fragen oder Probleme habt, schreibt mir!
MfG
Advanced