Servernamen alle x Sekunden ändern [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 liebe Community!


    Ich möchte euch heute ein Tutorial zeigen, wie ihr euren Servernamen alle x Sekunden ändern könnt. (automatische Funktion)
    Beispiel:
    Tutorial Reallife [0.3z]
    [0.3z] Tutorial Reallife [Neueröffnung]


    Als erstes benötigen wir folgendes (am Besten ganz am Anfang des Scripts):
    new Servername = 0;
    Mit dieser Variable können wir nun arbeiten.


    Als erstes brauchen wir unter "OnGameModeInit" einen Timer:

    public OnGameModeInit()
    {
    SetTimer("ServerName",2500,1);
    return 1;
    }

    Dieser Timer sagt aus, dass in 2500 Millisekunden (2,5 Sekunden) der Timer ausgelöst wird. Nach dem 2500 die 1 (true) sagt aus, dass dieser Timer nicht nur 1x verwendet wird, sondern öfters.


    Danach schreiben wir am Besten oberhalb OnGameModeInit() folgendes:
    forward ServerName();
    public ServerName();
    {
    return 1;
    }
    In diesem Public wird nun festgelegt, was im Timer passieren soll. (In diesem Fall Servername wird geändert)


    Nun kommt auch die vorher, definierte Variable zum Einsatz:
    forward ServerName();
    public ServerName();
    {
    if(Servername == 0)
    {
    return 1;
    }
    else if(Servername == 1)
    {
    return 1;
    }
    return 1;
    }
    Diese Variable sagt später aus, welcher Servername zurzeit gewählt ist.


    Nun möchten wir, dass der Servername ständig geändert wird, dies legen wir mit einem SendRconCommand fest.
    Damit dieser auch ständig gewechselt wird, benötigen wir unsere Variable, die auch ständig gesetzt wird.
    forward ServerName();
    public ServerName();
    {
    if(Servername == 0)
    {
    SendRconCommand("hostname Tutorial Reallife [0.3z]")
    Servername = 1;
    }
    else if(Servername == 1)
    {
    SendRconCommand("hostname [0.3z] Tutorial Reallife [Neueröffnung]")
    Servername = 0;
    }
    return 1;
    }
    Im SendRconCommand("TEXT") legen wir den ersten Servernamen fest.
    Darunter mit Servername = 1; damit, dass die Variable auf 1 wechselt und in 2,5 Sekunden die Variable 1 ausgelesen wird, nicht die 0, wie vorher.


    Dies war mein erstes Tutorial.
    Ich hoffe ich habe es nicht all zu kompliziert geschrieben.
    Ich weiß, dies ist für Anfänger - dies sollte auch Anfänger in den Einstieg des Scriptens helfen.

    2 Mal editiert, zuletzt von Rayan ()

  • Also unter dem Variablennamen "Servername" erwarte ich normalerweise einen Text, der den aktuellen Servernamen speichert.
    Genauso ist die Funktion "ServerName" irritierend meiner Meinung nach.


    Außerdem funktioniert (nicht getestet) dein "SendRconCommand" nicht, da er so nur versucht den Servernamen als RCON Befehl auszuführen was nicht funktioniert.
    Um den (Host-)Namen des Serves zu ändern brauchst du schon ein "hostname" von dem Namen (Quelle: http://wiki.sa-mp.com/wiki/RCON#RCON_Commands)


    Eine switch Anweisung wäre für einen Anfänger evtl. auch verständlicher als (bei z. B. 10 verschiedenen Servernamen) 10 "else-if" Anweisungen.

  • Außerdem ist es nicht nötig, bei folgendem Code:

    forward ServerName();
    public ServerName();
    {
    if(Servername == 0)
    {
    SendRconCommand("Tutorial Reallife [0.3z]")
    Servername = 1;
    return 1;
    }
    else if(Servername == 1)
    {
    SendRconCommand("[0.3z] Tutorial Reallife [Neueröffnung]")
    Servername = 0;
    return 1;
    }
    return 1;
    }


    in jeder Abfrage ein return zu haben, das return am Ende der Funktion reicht.

  • Also unter dem Variablennamen "Servername" erwarte ich normalerweise einen Text, der den aktuellen Servernamen speichert.
    Genauso ist die Funktion "ServerName" irritierend meiner Meinung nach.


    Außerdem funktioniert (nicht getestet) dein "SendRconCommand" nicht, da er so nur versucht den Servernamen als RCON Befehl auszuführen was nicht funktioniert.
    Um den (Host-)Namen des Serves zu ändern brauchst du schon ein "hostname" von dem Namen (Quelle: http://wiki.sa-mp.com/wiki/RCON#RCON_Commands)


    Eine switch Anweisung wäre für einen Anfänger evtl. auch verständlicher als (bei z. B. 10 verschiedenen Servernamen) 10 "else-if" Anweisungen.

    Sorry, war ein wenig Müde ;)
    Habe das hostname im RconCommand vergessen. :pinch:

  • Die Funktion könntest du "ChangeServerName()" nennen

    Quatsch, er kann sie nennen wie er will, ich habe meine damals voll bekloppt genannt, bspw. OnPlayerFightAgainstUnicorn :thumbup:


    Zurück zum Tutorial
    Wie der ette Wolf schon angesprochen hat solltest du switch & case benutzen.


    forward ServerName();
    public ServerName();
    {
    switch(Servername)
    {
    default:
    SendRconCommand("hostname Servername #0"), //Optional, falls vorher nicht deklariert
    Servername=0;
    case 0:
    SendRconCommand("hostname Servername #1"),
    Servername=1;
    case 1:
    SendRconCommand("hostname Servername #2"),
    Servername=2;
    case 2:
    SendRconCommand("hostname Servername #3"),
    Servername=3;
    case 3:
    SendRconCommand("hostname Servername #4"),
    Servername=0;
    }
    }


  • Man könnte das noch besser lösen via State Maschines :D


    main()
    {
    state serverName:Name1;
    SetTimer("ServerName",2500,1);
    }
    forward ServerName();
    public ServerName()<serverName:Name1>
    {
    state serverName:Name2;
    SendRconCommand("hostname Tutorial Reallife [0.3z]");
    }
    public ServerName()<serverName:Name2>
    {
    state serverName:Name1;
    SendRconCommand("hostname [0.3z] Tutorial Reallife [Neueröffnung]");
    }

  • Also ich hätte es so gemacht:


    Spoiler anzeigen


    new currentServernameIndex = -1;
    new serverNames[][32] =
    {
    "Servername 1",
    "Servername 2"
    };

    Spoiler anzeigen

    public OnGameModeInit() {
    SetTimer("changeServername",2500,1);
    return 1;
    }

    Spoiler anzeigen

    forward changeServername();
    public changeServername() {
    new string[41];
    if(currentServernameIndex + 1 >= sizeof(serverNames))
    currentServernameIndex = -1;

    format(string, sizeof string, "hostname %s", serverNames[++currentServernameIndex]);
    SendRconCommand(string);
    return 1;
    }


    Dadurch hat man den Vorteil, dass man im Array ganz einfach neue Servernamen hinzufügen kann, ohne irgendwo anders was im Script zu bearbeiten.

  • Wenn ihr es alle besser könnt, warum schreibt ihr dann nicht ein eigenes Tut? - Er hat doch geschrieben es ist sein erstes.


    Btt: Für Anfänger geeignet, fortgeschrittene wissen es bereits und brauchen das tut nicht.
    Damit ich hier nicht gleich den shitstorm Ernte, wer es bisschen besser haben will, kann sich an den Beiträgen nach dem TE orientieren :love:

  • Also ich hätte es so gemacht:


    Wenn wir schon dabei sind :D


    Will auch Senf dazugeben:


    stock const s_Names[][] = {
    "Servername 1", "Servername 2", "Servername 3"
    };


    //Unter OnGameModeInit / main
    SetTimer("@change_Host",1000,1);


    //Woanders im Skript
    @change_Host();@change_Host() {
    static x;
    if(x == sizeof s_Names) x=0;
    new buffer[sizeof(s_Names[]) + 0xA] = "hostname ";
    strcat(buffer, s_Names[x]),SendRconCommand(buffer);
    return x++;
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S