Adminlevel wird bei Serverrestart nicht gespeichert?

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
  • Hey
    Also ich hab folgendes Problem, wenn ich den Serverrestarte dann speichert es das Adminlevel nicht bzw es wird immer wieder auf 0 gesetzt.
    Alle anderen Daten speichert es also Level,Geld,ob der Spieler gebannt ist oder nicht nur das Adminlevel nicht. Und auch nur wenn ich per eigenem Befehl/restart oder als Rcon /gmx eingebe. Wenn ich den Server normal schließe speichert es wieder.


    Hier mal die wichtigen Teile aus dem Script
    public OnGameModeExit()
    {
    for(new p = 0; p < MAX_PLAYERS; p++) //wofür steht hier das for und das: = 0; p < MAX_PLAYERS; p++


    {
    if(IsPlayerConnected(p))
    {
    SpielerSpeichern(p);
    }
    }
    return 1;
    }


    //Adminbefehle
    if(strcmp(cmdtext,"/restart",true)==0)//Serverrestart
    {
    if(isPlayerAnAdmin(playerid,2000))
    {
    for(new p = 0; p < MAX_PLAYERS; p++) //wofür steht hier das for und das: = 0; p < MAX_PLAYERS; p++
    {
    if(IsPlayerConnected(p))
    {
    SpielerSpeichern(p);
    }
    }
    SendRconCommand("gmx");
    return 1;
    }
    else
    {
    SendClientMessage(playerid,rot,"Du hast nicht den nötigen Adminrang");
    }
    return 1;
    }


    stock LoadAccount(playerid)
    {
    new Spielerdatei[64];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
    SetPlayerScore(playerid,dini_Int(Spielerdatei,"Level"));
    GivePlayerMoney(playerid,dini_Int(Spielerdatei,"Geld"));
    SetPVarInt(playerid,"Adminlevel",dini_Int(Spielerdatei,"Adminlevel"));
    SetPVarInt(playerid,"Banned",dini_Int(Spielerdatei,"Banned"));
    //SpielerInfo[playerid][Adminlevel]=dini_Int(Spielerdatei,"Adminlevel");
    if(GetPVarInt(playerid,"Banned")==1)
    {
    SendClientMessage(playerid,rot,"Du bist vom Server gebannt.");
    Kick(playerid);
    }
    return 1;
    }


    stock SpielerSpeichern(playerid)
    {
    new Spielerdatei[64];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
    dini_IntSet(Spielerdatei,"Level",GetPlayerScore(playerid));
    dini_IntSet(Spielerdatei,"Geld",GetPlayerMoney(playerid));
    dini_IntSet(Spielerdatei,"Adminlevel",GetPVarInt(playerid,"Adminlevel"));
    dini_IntSet(Spielerdatei,"Banned",GetPVarInt(playerid,"Banned"));
    dini_IntSet(Spielerdatei,"timeban",GetPVarInt(playerid,"timeban"));
    return 1;
    }


    bei manchen publics hab ich einfach mal SpielerSpeichern eingesetzt um zu testen


    Icvh hoffe ihr könnt mir helfen sonst müsste ich jedes mal in der .txt Datei das Adminlevel neu setzten

    Einmal editiert, zuletzt von MrMonkey ()

  • hast du auch bei OnPlayerDisconect:



    SpielerSpeichern(playerid);




    MFG Daniel

  • Jup ist da auch drin


    public OnPlayerDisconnect(playerid, reason)
    {
    //SpielerSpeichern
    SpielerSpeichern(playerid);


    //Verlassen Nachrichten
    new pName[MAX_PLAYER_NAME];
    new string[56];
    GetPlayerName(playerid, pName, sizeof(pName));


    switch(reason)
    {
    case 0: format(string, sizeof(string), "%s hat den Server verlassen. (Error)", pName);
    case 1: format(string, sizeof(string), "%s hat den Server verlassen.", pName);
    case 2: format(string, sizeof(string), "%s hat den Server verlassen. (Kick/ban)", pName);
    }


    SendClientMessageToAll(0xAAAAAAAA, string);
    return 1;
    }

    3 Mal editiert, zuletzt von MrMonkey ()

  • Code
    for(new p = 1; p < MAX_PLAYERS; p++)


    Versuchs mal so.

    Dann wird jedoch die UserID 0 ausgelassen - woran es zudem deshalb nicht liegen kann, weil über das gleiche Verfahren auch die anderen Daten (erfolgreich) gespeichert werden.


    Ich schließe mich hiermit übrigens dem Problem an.
    Auch bei mir werden alle Daten gespeichert, außer einer (bei mir ist es der Skin). Ebenfalls nur dann, wenn ich den Server über Befehl (rcon) /gmx restarte.
    Bei einem einfachen Disconnect oder dem Beenden und erneuten Starten des Servers gibt es keinerlei Probleme.

  • Zitat

    Dann wird jedoch die UserID 0 ausgelassen - woran es zudem deshalb nicht liegen kann, weil über das gleiche Verfahren auch die anderen Daten (erfolgreich) gespeichert werden.


    Ich schließe mich hiermit übrigens dem Problem an.
    Auch bei mir werden alle Daten gespeichert, außer einer (bei mir ist es der Skin). Ebenfalls nur dann, wenn ich den Server über Befehl (rcon) /gmx restarte.
    Bei einem einfachen Disconnect oder dem Beenden und erneuten Starten des Servers gibt es keinerlei Probleme.


    [/qoute]
    Für den GMX Command, benutze ich dieses hier:
    ocmd:GMX(playerid,params[])
    {
    if(!isPlayerAnAdmin(playerid,1))return SendClientMessage(playerid,ROT,"Du bist kein Admin");
    if(isPlayerAnAdmin(playerid,1))
    {
    for(new i=0; i<GetMaxPlayers(); i++)
    if(!IsPlayerNPC(i))
    if(IsPlayerConnected(i))
    SpielerSpeichern(i);
    printf("[MySql] Alle Spieler wurden erfolgreich gespeichert ((GMX))");
    SendClientMessageToAll(GRÜN, "Dein Account wurde gespeichert.");
    SendRconCommand("gmx");
    return 1;
    }
    return 1;
    }


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Ist doch gleichgültig wie du diesen startest... er wird immer über die Befehlszeile
    SendRconCommand("gmx"); ausgeführt (oder eben als rcon-admin).


    Die Frage ist, WARUM der Wert in allen Fällen gespeichert wird, sich jedoch zurück setzt (also nicht nur einfach "nicht gespeichert"), wenn der Server über einen Befehl restartet wird.


    //Edit: Der Weg, bei einem Restart durch Befehl vorab alle Daten speichern zu lassen, bevor der eigentliche Restart durchgeführt wird, wäre sicher ein Weg welcher zur Lösung führt.

  • Oder du durchläufst bei einem GMX einfach mit einer For-Schleife, siehe Beispiel, das wollte der Threadersteller doch haben? Dass die Spieler bei einem GMX gespeichert werden ;D


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Oder du durchläufst bei einem GMX einfach mit einer For-Schleife, siehe Beispiel, das wollte der Threadersteller doch haben? Dass die Spieler bei einem GMX gespeichert werden ;D

    Ja, siehe mein //Edit im letzten Beitrag. Damit habe ich mich auf deine Lösung bezogen.
    Aber: Was der "Spieler" (und ich) wollten ist eine Antwort darauf, warum dieser eine Wert bei einem Restart (über Befehl) auf 0 zurück gesetzt wird, wärend alle anderen Werte normal gespeichert werden; denn weiterhin tritt das Problem dabei bei Disconnects usw. NICHT auf - und weiterhin gibt es für den Server keine Veranlassung, bei einem per Befehl durchgeführten Restart diesen einen Wert zurück zu setzen!


    Die Methode, bei jedem GMX-Befehl separat sämtliche Werte zu speichern würde sicherlich funktionieren (oder auch nicht, wenns dann zurück gesetzt wird ^^), ist aber keine Antwort auf die Frage... *grins*

  • Achso. - SpielerSpeichern(playerid) bzw. pID, schon mal im public OnGameModeExit versucht? :<
    Ich weiß ja nicht womit du abspeicherst, bei mir hats immer geklappt, Dini & MySQL


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • for(new p = 1; p < MAX_PLAYERS; p++
    Das ist eine Schleife, damit fragst du alle Spieler
    ab die besondere Eigenschaften haben. Sprich eine
    neue Variable für die Spieler new p = 1
    dann soll diese Variable kleiner sein als alle Spieler und bei
    p++ werden alle ID's durchlaufen. Also id 0,1,2,3,4,5,6,7 und so weiter.
    So habe ich das verstanden :)

  • p++ werden alle ID's durchlaufen. Also id 0,1,2,3,4,5,6,7 und so weiter.


    Fast... Das "p++" steht dafür, dass er die Zahl die er durchgehen soll immer um eins erhöht. Weil es nichts nützt wenn 10 Spieler auf dem Server sind und er 150 Ids durchlaufen lässt.


    lg

    RTL - Das N steht für Niveau!
    MfG,
    StreetS


    Jegliche Freundesanfragen, die für mich keinen Sinn ergeben, werden professionell Ignoriert. (Gleiche mit Skype!)
    Wer es nicht kapiert wird in Breadfish & Skype blockiert.


    - Stolzer PAWN Scripter der Klasse Beherrscht