Spielerdaten bei neustart sichern

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
  • Ich habe ein merkwürdigas Problem:
    Wenn ich mein server neu starte und es befinden sich wärend des neustarts spieler darauf so können sie sich nicht wieder einloggen. Als Meldung kommt nur das mein Passwort falsch wäre. Nachdem der Spieler sein SSMP neu gestartet hat kommt er wieder mit dem passwort rein ist aber wieder ein normaler user. Hier mal das Script welches mit der SII.inc läuft:


    public OnPlayerConnect(playerid)
    {
    //Login & Registrieren
    format(pfad,64,"/Accounts/%s.ini",Spielername(playerid));
    if(fexist(pfad))
    {
    ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_PASSWORD,"Login","Bitte gib dein Passwort ein.","Einloggen","Abbrechen");
    }
    else if(!fexist(pfad))
    {
    ShowPlayerDialog(playerid,Dialog_Register,DIALOG_STYLE_INPUT,"Registration","Herzlich Willkommen bei United-Freaks.\nBitte gib dein gewünschtest Passwort ein\num dich zu registrieren.","Registrieren","Abbrechen");
    }
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason)
    {
    format(pfad,64,"/Accounts/%s.ini",Spielername(playerid));
    if(INI_Open(pfad))
    {
    INI_WriteInt("Rang",pInfo[playerid][Rang]);
    INI_Save();
    INI_Close();
    }
    return 1;
    }



    case Dialog_Register:
    {
    if(response == 1)
    {
    format(pfad,64,"/Accounts/%s.ini",Spielername(playerid));
    if(INI_Open(pfad))
    {
    INI_WriteString("Name",Spielername(playerid));
    INI_WriteString("Passwort",inputtext);
    INI_WriteInt("Rang",0);
    INI_Save();
    INI_Close();
    SendClientMessage(playerid,GREEN,"Du hast dich erfolgreich registriert");
    ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_PASSWORD,"Login","Bitte gib dein Passwort ein.","Einloggen","Abbrechen");
    }
    }
    if(response == 0)
    {
    Kick(playerid);
    }
    }
    case Dialog_Login:
    {
    if(response== 1)
    {
    if(INI_Open(pfad))
    {
    INI_ReadString(pInfo[playerid][Passwort],"Passwort",20);
    if(strcmp(inputtext,pInfo[playerid][Passwort],false))
    {
    ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_PASSWORD,"Login","Bitte gib dein Passwort ein.","Login","Abbrechen");
    SCM(playerid,ROT,"Falsches Passwort");
    }
    else
    {
    INI_ReadString(pInfo[playerid][Name],"Name",MAX_PLAYER_NAME);
    INI_ReadString(pInfo[playerid][Passwort],"Passwort",20);
    pInfo[playerid][Rang] = INI_ReadInt("Rang");
    INI_Close();
    }
    }
    }
    }
    Ich weiß nicht ob es wichtig ist aber hier mein restart befehl:
    public OnPlayerCommandText (playerid, cmdtext[])
    {
    if(strcmp(cmdtext, "/restart", true)==0)
    {
    if(pInfo[playerid][Rang] > 1)
    {
    SendRconCommand("gmx");
    }
    else
    {
    SendClientMessage(playerid,ROT,"Du bist leider kein Admin! Gib /help ein!");
    }
    return 1;
    }
    return 1;
    }





    Mein Gedanke ist nun dieser: Ich denke es wird einfach nicht gespeichert welcher Rang zu welchem Spieler gehört darum möchte ich gern bei meinem /restart Befehl alle Userdaten mit einmal speichern. Dabei müsste abgefragt werden wieviele Spieler auf dem Server sind und welche ID sie haben. Danach müssten alles gesichert werden. Leider fehlt mir jeglicher Gedankensprung für den Anfang solch einer Idee. Oder habe ich einen Fehler gemacht?


    Danke euch

  • sofern du nicht Daten ausließt wie die position sondern alles in Variabeln temporär speicherst sollte das ganze gehen da bei einem restart OnPlayerDisconnect aufgerufen
    wird für dne spieler. Du kannst natürlich auch alle spieler daten speichern in dem du die funktion aufrufst oder eine funktion machst welche aufgerufen wird wnen die daten für den spieler gespeichert werden sollen via for schleife. und den restart erst verzögert ausführst. Das kannst du auch machen.

  • ähm... sorry aber dasist mir irgendwie zu hoch...


    Kann ich nicht einfach den text hier mit in mein restart befhel kopieren?
    public OnPlayerDisconnect(playerid, reason)
    {
    format(pfad,64,"/Accounts/%s.ini",Spielername(playerid));
    if(INI_Open(pfad))
    {
    INI_WriteInt("Rang",pInfo[playerid][Rang]);
    INI_Save();
    INI_Close();
    }
    return 1;
    }


    Also kopieren geht auch und derjenige der den befehl eingibt funktioniert auch aber wie führe ich den teil für jeden spieler aus?


    Ich bräuchte sowas wie
    Wieviele spieler online? -> 5
    und dann für die id 1- 5 einfach oben den text ausführen aber wie kann ich sowas machen?
    oder gibt es eine möglichkeit alle spieler disconnecten zu lassen


    disconnect (all) oder so


    klingt dumm aber mir fehlt echt jeder gedanke dazu...

  • wie gesagt mach dir eine funktion

    SavePlayer(playerid){
    format(pfad,64,"/Accounts/%s.ini",Spielername(playerid));
    if(INI_Open(pfad)){
    INI_WriteInt("Rang",pInfo[playerid][Rang]);
    INI_Save();
    INI_Close();
    }
    }


    und um die ganzen spieler durchzugehen eine for-schleife


    for(new i; i < MAX_PLAYERS; ++i)If(IsPlayerConnected(i))SavePlayer(i);


    es kann sein das du pfad in dem nebenfunktion deklarieren musst ich weiß ja nicht ob du den als globale array verwendest.
    sieht jedoch so aus.

  • ok sowiet so gut... Fehler besteht trotzdem noch woran könnte es noch liegen?


    ICh habe die funktion erstellt und die funktioniert auch. In der datei steht dann immer der neuste Rang und das neuste kennwort vom registrieren. wenn ich mich nun einlogge kommt trotzdem falsches kennwort... was nicht stimmt woran könnte es liegen? achso einige spieler können joinen ohne probleme. Und wenn ich auf abbrechen klicke soll man eigentlich gekickt werden aber man kann dann ohne kennwort join...


    Irgendwie habe ich da einen rießigen bug drin aber ich kann ihn nicht finden





    Edit:


    jetzt mal eine extrem bekloppte idee... Ich sollte ja damals von anraten eines erfahrenen Scripters lieber SII benutzen anstelle von Dini.
    Kann das sein das SII einfach nur extrem langsam ist... ich habe nen schnellen PC und ne verdammt geile i-net leitung bin also immer einer der ersten auf dem server nach dem restart. Andere User die lange brauchen bis sie nach dem restart das loginfeld sehen können ohne probleme joinen. Gibt es eine möglichkeit das loginscript später anzuzeigen und stadessen z.B. eine meldung anzuzeigen wo steht der Server wird gesatartet oder so... (vlt für 20 Sekunden dann bin ich ganz sicher)

    Einmal editiert, zuletzt von Takiry ()