Probleme mit /restart

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,


    ich habe mir mit ocmd einen restartbefehl gebaut und habe festgestellt, dass die Daten nicht gespeichert werden, wenn man den Server neu startet. Jetz wollte ich das so machen, dass die Spielerdaten gespeichert werden, bevor der Server neustartet, aber es funktioniert nicht. Ich habe mir das so vorgestellt:
    ocmd:restart(playerid,params[])
    {
    if(SpielerInfo[playerid][pAdmin] == 5)
    {
    for(new i=0; i<GetMaxPlayers(); i++)
    {
    SavePlayer(i);
    }
    SendRconCommand("gmx");
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Dazu bist du nicht befugt!");
    }
    return 1;
    }
    Danke im Vorraus für die Hilfe

  • Könnte sein, ich habe aber erst vor ein paar Tagen angefangen mich richtig mit pawn auseinander zu setzten unf habe keinerlei erfahrung mit Timern. Wenn mir jemadn entweder direkt hier erklären könnte wie es geht oder mit einen Link zu einem Tutorial schicken könnte wäre das super.

  • Also wenn du einen Timer setzt, dann macht man es mit publics.


    Das heißt oben im Script macht man
    forward TimerName;
    Da es nun geforwarded ist muss man natürlich auch das dazugehörige public erstellen. Das tut man (also ich) immer ganz untem im Script.
    public TimerName()
    {
    SendRconCommand("gmx");
    return 1;
    }
    Nun haben wir es und müssen nur noch den Timer setzen.
    Das tun wir an der gewünschten Stelle, wo es nach X Sekunden ausgeführt werden soll. Timer erstellt man mit "SetTimer" oder "SetTimerEx". Wir nehmen "SetTimer", da es in diesem Fall einfacher ist.
    SetTimer("TimerName", 1000, false);Das erste ist der public, der nach dem Ablauf der Zeit ausgeführt werden soll. In diesem Fall "TimerName". Das zweite ist nicht schwer und bestimmt die Millisekundenanzahl, nachdem das public dann ausgeführt wird. 1000 Millisekunden sind 1 Sekunde. Es wird also nach 1 Sekunde ausgeführt. Und die 3. Stelle bestimmt, ob der Timer wiederholt werden soll. Da das public nur einmal und nicht jede Sekunde erneut ausgeführt werden soll, setzen wir dies auf "false". (True, wenn es wiederholt werden soll).


    Hoffe ich habe das jetzt so richtig gemacht. ^^ Komme gerade von einer Party, wo einer 18 geworden ist und bin deswegen auch nicht mehr soooo fit :)
    Hoffe es hilft und funktioniert. Dürfte aber :D

  • So:


    if(strcmp(cmd, "/gmx", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(SpielerInfo[playerid][pAdmin] >= 5)
    {
    ForEachPlayer(i)
    {
    GameTextForAll("~w~~b~~n~~n~Der Server startet ~n~~r~neu!", 5000,6);
    SavePlayer(i);
    }
    SetTimer("TimerName", 5000, false);
    }
    else
    {
    SendClientMessage(playerid,COLOR_GREY,"** Du bist kein Administrator!");

    }
    return 1;
    }
    }

    Du musst dazu den forward und den public von meinem Vorposter nehmen!

  • Verbesserungsvorschlag:
    Da du für jeden Spieler "GameTextForAll" hast, wird es oft erstellt. Ich würde das zu "GameTextForPlayer" ändern.
    forward TimerName(); // Direkt über dem dazugehörigen Public
    public TimerName() // Ganz unten im Skript
    {
    SendRconCommand("gmx");
    return 1;
    }


    if(strcmp(cmd, "/gmx", true) == 0) // Unter OnPlayerCommandText
    {
    if(IsPlayerConnected(playerid))
    {
    if(SpielerInfo[playerid][pAdmin] >= 5)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    GameTextForPlayer(i, "~w~~b~~n~~n~Der Server startet ~n~~r~neu!", 5000, 6);
    SavePlayer(i);
    }
    SetTimer("TimerName", 5000, false);
    }
    else return SendClientMessage(playerid,COLOR_GREY,"** Du bist kein Administrator!");
    }
    return 1;
    }

  • Aber ForEachPlayer und i sind jetzt nicht definiert. Dadurch dass ich das ganze mit ocmd mache definiere ich die variablen immer erst dann wenn ich sie auch brauche. Dann behalte ich immer die entsprechenden Variablen im Blick.


    edit:
    Ok ich habe das ganze jetzt so gemacht:
    ocmd:restart(playerid,params[])
    {
    if(SpielerInfo[playerid][pAdmin] == 5)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    SavePlayer(i);
    }
    SetTimer("restartTimer",2000,false);
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Dazu bist du nicht befugt!");
    }
    return 1;
    }
    Mal sehen ob es ingame funzt.


    edit2: Ok es hat jetzt funktioniert. Vielen Dank für die Hilfe. :)

  • Wie wäre es, wenn du einfach unter "OnGameModeExit" speicherst? ^^


    Hab ich ja aber dann hat er es bei einem restart aus irgendeinem Grund nicht gespeichert.
    Ich habe bin aber noch am basteln. Ich bin froh, dass ich jetzt nach 2 Tagen ein paar Grundfunktionen auf dei Reihe bekommen habe. Ich habe zum Beispiel keine Ahnung, wie ich das /sup system machen soll :wacko:

  • Versuch den Befehl mal so,


    ocmd:restart(playerid)
    {
    if(SpielerInfo[playerid][pAdmin] == 5)return SendClientMessage(playerid,0x00489184,"Du bist nicht befugt diesen Command zu nutzen!");
    {
    SavePlayer(playerid);
    SendRconCommand("gmx");
    }
    return 1;
    }




    Grüße


  • So hatte ich ihn am Anfang, aber das hat nicht funktioniert. Aber es hat ja wie gesagt funktioniert:
    ocmd:restart(playerid,params[])
    {
    if(SpielerInfo[playerid][pAdmin] == 5)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    SavePlayer(i);
    }
    SetTimer("restartTimer",2000,false);
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Dazu bist du nicht befugt!");
    }
    return 1;
    }

  • So, er Restartet den Server aber Speichert die Accounts also nicht, Ja?



    Dann gebe uns doch bitte mal:


    • Den Spieler speichern stock
    • und am besten gleich noch den LoadAccount stock wo er die accounts laden tut..



    Grüße

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen