Server Restart Befehl + Grund (Anfänger)

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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



  • 7/10 Nettes Tutorial. Aber die Abfrage "IsPlayerConnected" gibt es nicht nur in Godfathern ;)
    Die Funktion ist bereits normal in Samp vorhanden...


    Kritisieren kann ich, dass keine vernünftigen / eindeutigen Namen verwendet werden, die schon auf den ersten Blick auch nach längerer Zeit und ggf. andere sofort zu erkennen sind. Z.B: tim_restart. Dann wüsste jeder, der deinen Stil einigermaßen kennt oder nicht ganz doof ist, dass es sich um einen Timer handelt. Oder für TextDraws "txt_Weburl".


    Lg

  • Du hast SetTimerEx & darin playerid verwendet. Wenn du einen Server restarten willst, brauchst du nur SetTimer, da der Timer ja global ist.


    Das ganze könnte man noch etwas verkürzen
    if(strcmp(cmd,"/srestart",true) == 0)
    {
    if(!PlayerInfo[playerid][pAdmin] >=6)return SendClientMessage(playerid, -1," Du bist nicht befugt");
    if(Restarts !=1)return SendClientMessage(playerid, -1, " Es wurde bereits...");
    Show...
    return 1;
    }
    Selbiges bei OnDialogResponse


    IsPlayerConnectedist irgendwie nonsense, da man das hier nicht braucht -> Wenn man einen Befehl eingibt, ist man natürlich ingame ^^



    MFG
    Manniac

  • Ja, aber es soll für Anfänger übersichtlich sein, klar weiß ich dass das so besser geht, aber es ist ein Anfänger Tutorial

    Das hat damit nichts zu tun. Anfänger verwirren durch das "i" & das playerid im Timer. Dazu kommt noch das es nicht nur besser ist sondern einfach schlicht weg richtig ist. Das was du dort geschrieben hast ist bullshit und kein Tutorial. Von daher entfällt jegliche weitere Bewertung.

  • Naja, aber du kannst es denen doch gleich so zeigen, damit die es sich so einprägen..
    Wenn man es so macht, wie du, hat man zu viele Klammern und es ist finde ich unübersichtlich...
    Aber jeder scriptet, wie er will, hauptsache es klappt ;)

  • IsPlayerConnected(playerid))


    Ist nicht gleich gf das ist ne standart funktion von samp bzw pawno und hat nix mit gf zutun... in selfmade muss man es auch irgendwan an ein punkt abfragen :)
    zb wen den user was geben möchte und ne naricht dabei will usw



    ansonsten gutes tut fürn anfang

  • toll, dass jemand die grundlegenden Sachen erklärt!

    Mittelsmann Service
    Seit 2014 agiere ich in diesem Forum als Mittelsmann. Als es Mein-Mittelsmann noch gab, zählte ich zu den vertrauenswürdigsten Mittelsmännern, welche auch hier im Forum aufgelistet waren. Seit Beginn meiner Laufbahn wickelte ich bisher schon rund 100 Transaktionen mit Erfolg ab. Wenn du also nach einem erfahrenen und vertrauenswürdigem Mittelsmann suchst, kontaktiere mich gerne.