Server restart = Alles auf 0 ?! =O

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
  • Guten Abend Zusammen,


    ich habe ein mehr oder weniger Großes Problem.
    Wenn ich den Server Restarte, werden irgendwie alle Accounts verbuggt..


    Entweder bekommen sie irgendeine Fraktion , oder sie bekommen eine Adminlevel , ...
    Passwort=*zensiert*
    Level=0
    firstlog=0
    Adminlevel=0
    Fraktion=0
    Skin=78
    Nebenjob=0
    Versicherung=0
    Inventar=0
    Invslot1=0
    Invslot2=0
    Invslot3=0
    Warns=0
    Autol=0
    Rang=0
    gehalt=0
    kh=0
    Geld=0
    anonym=0
    PayDay=0
    Monate=0
    Banned=0
    Konto=0


    das passwort und der skin ist das einzigste was bleibt.
    der rest wird dann auf 0 gesetzt und keiner weis warum :(.


    Wenn der server an bleibt und man reloggt, wird gekickt oder was weis ich, die Dateien werden gespeichert.
    Wenn die User dann wieder on kommen ist auch alles normal..


    Nur wenn ich den Server mal restarte, bzw was am script gemacht habe und ihn neu anmache, wird alles irgendwie auf 0 gesetzt



    ABER WARUM?!


    Kann mir da villeicht jemand helfen?

  • Es könnte evt. daran liegen, dass du einfach Speichern, Neustarten und Laden schlecht kombiniert hast. Daten sollten nur geladen werden, wenn ein Spieler eingeloggt ist. Das Speichern der Daten muss vor dem Neustart erfolgen. Ein Timer wird hier bei großen Datenmengen von Nöten sein, da es Zeit zum Verarbeiten benötigen wird. Ebenfalls solltest du beim Neustart des Servers unbedingt alle SpielerDaten zurücksetzen, sodass Daten nicht von einem auf den anderen Spieler übertragen werden können.

  • Wir nehmen zwei Spieler, die deinen Server betreten. Einer der Spieler ist ein Admin höchtem Rank, wessen Adminrank in dem Array SpielerInfo[][pAdminlevel] gespeichert wird. Nun verlässt dieser Spieler den Server und der nächste Spieler betritt den Server. Dieser hat für ihn glücklicherweiße die exakt gleiche SpielerID wieder der Admin zuvor. Da nun die Daten im Array nicht zurückgesetzt wurden, könnte es sein, dass der Spieler nun direkt Zugriff hat, wie der Admin zuvor. Dies könnte natürlich durch das Laden verschiedener Daten verhindert werden, dennoch denke ich nicht, dass du alle Daten eines Spielers beim Login lädst, da dies nicht sehr sinnvoll wäre.

  • Du lädst das, was du brauchst. Ich würde niemals Daten laden, die ich nicht benötige. Das ermöglicht es mir Datenmengen zu vermindern und somit meine Ressourcen zu sparen. Ich lade meine Daten, wenn ich sie benötige und das auch nur einmal, wenn sie nicht geladen sind. Dennoch nur, wenn ich sie nicht konstant benötige, wie zum Beispiel in Informationsfenstern.

  • aber ich brauche doch alles ^^
    kann auch sein das ich grade alles extrem falsch verstehe ..
    hier mein LoadAccount:
    stock LoadAccount(playerid)
    {
    new Spielerdatei[64];
    new Sname[MAX_PLAYER_NAME];
    GetPlayerName(playerid,Sname,sizeof(Sname));
    format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",Sname);
    SetPlayerScore(playerid,dini_Int(Spielerdatei,"Level"));
    SetPVarInt(playerid,"firstlog",dini_Int(Spielerdatei,"firstlog"));
    SpielerInfo[playerid][Adminlevel]=dini_Int(Spielerdatei,"Adminlevel");
    SpielerInfo[playerid][Fraktion]=dini_Int(Spielerdatei,"Fraktion");
    SetPlayerSkin(playerid,dini_Int(Spielerdatei,"Skin"));
    SetPVarInt(playerid,"Nebenjob",dini_Int(Spielerdatei,"Nebenjob"));
    SpielerInfo[playerid][Versicherung]=dini_Int(Spielerdatei,"Versicherung");
    SetPVarInt(playerid,"Inventar",dini_Int(Spielerdatei,"Inventar"));
    SetPVarInt(playerid,"Invslot1",dini_Int(Spielerdatei,"Invslot1"));
    SetPVarInt(playerid,"Invslot2",dini_Int(Spielerdatei,"Invslot2"));
    SetPVarInt(playerid,"Invslot3",dini_Int(Spielerdatei,"Invslot3"));
    SetPVarInt(playerid,"Warns",dini_Int(Spielerdatei,"Warns"));
    SetPVarInt(playerid,"Autol",dini_Int(Spielerdatei,"Autol"));
    SetPVarInt(playerid,"Rang",dini_Int(Spielerdatei,"Rang"));
    SetPVarInt(playerid,"gehalt",dini_Int(Spielerdatei,"gehalt"));
    SetPVarInt(playerid,"kh",dini_Int(Spielerdatei,"kh"));
    GivePlayerMoney(playerid,dini_Int(Spielerdatei,"Geld"));
    SetPVarInt(playerid,"anonym",dini_Int(Spielerdatei,"anonym"));
    SetPVarInt(playerid,"PayDay",dini_Int(Spielerdatei,"PayDay"));
    SetPVarInt(playerid,"Monate",dini_Int(Spielerdatei,"Monate"));
    SetPVarInt(playerid,"Banned",dini_Int(Spielerdatei,"Banned"));
    SetPVarInt(playerid,"Konto",dini_Int(Spielerdatei,"Konto"));
    SetPVarInt(playerid,"Hausnummer",dini_Int(Spielerdatei,"Hausnummer"));
    if(GetPVarInt(playerid,"Banned")==1)
    {
    SendClientMessage(playerid,Rot,"S.Y.S.T.E.M: Dein Account wurde vom Server gebannt.");
    Kick(playerid);
    }
    SetPVarInt(playerid,"loggedin",1);
    return 1;
    }

  • Wenn du alles benötigst, ist das ja gut. Das alles hat aber nichts mehr mit deinem Problem zu tun. Debugge doch einfach mal. Lass dir vor dem Speichern Daten ausgeben. Nach dem Speichern und vor dem Neustart und vor dem Login und nach dem Login. Dann wirst du bereits sehen, wo der Hacken liegt.

  • Ahja, PVars, hab' ich's nicht vorher schon geschrieben? Es gibt einen Bug in SA-MP, bei dem die PVars zurückgesetzt oder wahrscheinlich sogar gelöscht werden, BEVOR die Spieler disconnecten. Also werden "falsche" Werte abgespeichert.


    Mach deinen eigenen Command, der zuerst alle Spieler kickt und dann den Server neustartet!



    // ZCMD
    COMMAND:gmx(playerid, params[])
    {
    if (!IsPlayerAdmin(playerid))
    return 0;

    SendClientMessageToAll(0xFF0000FF, "Server wird neugestartet!");
    for (new i = 0; i < MAX_PLAYERS; i++)
    Kick(i);
    SendRconCommand("gmx");
    return 1;
    }

  • Wie gesagt, du lässt dir Daten bei bestimmten Punkten ausgeben, wodurch du Werte vergleichen kannst und somit den Rahmen, indem du suchen musst, verkleinern kannst. Als Beispiel könnte man das Konto des Spielers verwenden. Du lässt dir es öfters Ausgeben und merkst dadurch, wo das Problem liegt.



    printf("%i", GetPVarInt(playerid, "Konto"));


  • Wie gesagt, du lässt dir Daten bei bestimmten Punkten ausgeben, wodurch du Werte vergleichen kannst und somit den Rahmen, indem du suchen musst, verkleinern kannst. Als Beispiel könnte man das Konto des Spielers verwenden. Du lässt dir es öfters Ausgeben und merkst dadurch, wo das Problem liegt.


    printf("%i", GetPVarInt(playerid, "Konto"));


    und wo muss das dann hin?
    kannst du mir das per TV machen?

  • stock SpielerSpeichern(playerid)
    {
    new Spielerdatei[64];
    new Sname[MAX_PLAYER_NAME];
    GetPlayerName(playerid,Sname,sizeof(Sname));
    format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",Sname);
    dini_IntSet(Spielerdatei,"Level",GetPlayerScore(playerid));
    dini_IntSet(Spielerdatei,"firstlog",GetPVarInt(playerid,"firstlog"));
    dini_IntSet(Spielerdatei,"Adminlevel",SpielerInfo[playerid][Adminlevel]);
    dini_IntSet(Spielerdatei,"Fraktion",SpielerInfo[playerid][Fraktion]);
    dini_IntSet(Spielerdatei,"Skin",GetPlayerSkin(playerid));
    dini_IntSet(Spielerdatei,"Nebenjob",GetPVarInt(playerid,"Nebenjob"));
    dini_IntSet(Spielerdatei,"Versicherung",SpielerInfo[playerid][Versicherung]);
    dini_IntSet(Spielerdatei,"Inventar",GetPVarInt(playerid,"Inventar"));
    dini_IntSet(Spielerdatei,"Invslot1",GetPVarInt(playerid,"Invslot1"));
    dini_IntSet(Spielerdatei,"Invslot2",GetPVarInt(playerid,"Invslot2"));
    dini_IntSet(Spielerdatei,"Invslot3",GetPVarInt(playerid,"Invslot3"));
    dini_IntSet(Spielerdatei,"Warns",GetPVarInt(playerid,"Warns"));
    dini_IntSet(Spielerdatei,"Autol",GetPVarInt(playerid,"Autol"));
    dini_IntSet(Spielerdatei,"Rang",GetPVarInt(playerid,"Rang"));
    dini_IntSet(Spielerdatei,"gehalt",GetPVarInt(playerid,"gehalt"));
    dini_IntSet(Spielerdatei,"kh",GetPVarInt(playerid,"kh"));
    dini_IntSet(Spielerdatei,"Geld",GetPlayerMoney(playerid));
    dini_IntSet(Spielerdatei,"anonym",GetPVarInt(playerid,"anonym"));
    dini_IntSet(Spielerdatei,"PayDay",GetPVarInt(playerid,"PayDay"));
    dini_IntSet(Spielerdatei,"Monate",GetPVarInt(playerid,"Monate"));
    dini_IntSet(Spielerdatei,"Banned",GetPVarInt(playerid,"Banned"));
    dini_IntSet(Spielerdatei,"Konto",GetPVarInt(playerid,"Konto"));
    dini_IntSet(Spielerdatei,"Hausnummer",GetPVarInt(playerid,"Hausnummer"));
    return 1;
    }

  • Nimm dir doch einfach den public OnGameModeExit zur Hilfe?
    Loope mit einer Schleife alle Spieler durch und lass sie komplett speichern.

    Spoiler anzeigen


    for(new i = 0; i <MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    SpielerSpeichern(i);
    }
    }


    lg :thumbup:

    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