Nach Serverrestart - 0Punkt

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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,


    Ich habe nun ein System, das ich dort spawne, wo ich mich ausgeloggt habe. Das klappt alles soweit auch, aber wenn ich im Spiel gehe, auf dem Desktop dann in der Konsole "gmx" eingebe, und nach dem Restart mich einlogge, spawne ich am 0Punkt.


    Hier mein Code:
    public OnPlayerRequestClass(playerid, classid)
    {
    if(Spieler[playerid][Spawn] == 0)
    {
    SetSpawnInfo(playerid,0,0,1128.8900,-1488.0811,22.7690,359.4727,0,0,0,0,0,0);
    SpawnPlayer(playerid);
    }
    else
    {
    Spieler[playerid][PosX] = cache_get_field_content_float(0,"PosX",handle);
    Spieler[playerid][PosY] = cache_get_field_content_float(0,"PosY",handle);
    Spieler[playerid][PosZ] = cache_get_field_content_float(0,"PosZ",handle);
    Spieler[playerid][PosA] = cache_get_field_content_float(0,"PosA",handle);
    SetSpawnInfo(playerid,0,0,Spieler[playerid][PosX],Spieler[playerid][PosY],Spieler[playerid][PosZ],Spieler[playerid][PosA],0,0,0,0,0,0);
    SpawnPlayer(playerid);
    }
    return 1;
    }
    Ich hoffe mir kann einer helfen.

  • das is nicht nur bei getplayerpos so.. das kenn ich auch von getplayerskin und anderen sachen.
    ich vermute mal die sachen werden einfach zu spät ausgelesen.
    ich habe mir einen /restart befehl geschrieben in dem die spieler abgespeichert und gekickt werden 1 sekunde bevor der gmx befehl kommt.
    wüsste aber auch gerne wie man das sonst machen könnte.. den skin kann man ja im enum abspeichern wenn er sich ändert..
    aber man kann ja nicht die ganze zeit die koordinaten auslesen lassen. (könnte schon aber resourcenfreundlichkeit sagt nein)

  • Ihr habt das richtig erkannt. Die Daten werden teilweise gelöscht, bevor ihr Sie speichern könnt. Die beste Methode einen restart Befehl zu machen ist es beim Befehl erstmal alles zu speichern, danach eine globale variable zu setzen und dann den GMX command zu senden.
    Bei all euren speicherfunktionen, die zB durch Sachen wie onplayerdisconnect ausgelost werden, fragt ihr erst ab, ob nicht gerade ein restart durchgeführt wird(variable im restart befehl), dann verhindert ihr das speichern und somit ein überschreiben der Daten.
    Alles verstanden?

  • Klappt leider nicht, ich spawne immer noch am 0-Punkt.


    dcmd_restart(playerid,params[])
    {
    #pragma unused params
    SendClientMessage(playerid,grau," Serverrestart!");
    for(new i=0;i<GetMaxPlayers();i++)
    {
    Speichern(i);
    SetTimer("RestartTimer",6000,0);
    }
    SendClientMessageToAll(rot,"In 6 Sekunden startet der Server neu!");
    return 1;
    }

  • du hast wohl ned verstanden, was ich gmeint hab.
    Naja, du erstellst eine globale variable, zB
    new bool:restart;


    dann kommt hier dein restart befehl:


    bei deiner speicherfunktion:

    Code
    stock spielerSpeichern(playerid)
    {
    	if(restart) return 0; //Wenn restart stattfindet, dann abbrechen
            //...
            //Hier dein zeug speichern
            //...
    	return 1;
    }
  • So?
    dcmd_restart(playerid,params[])
    {
    #pragma unused params
    SendClientMessage(playerid,grau," Serverrestart!");
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(!IsPlayerConnected(i)) continue;
    Speichern(i);
    }
    ress = true;
    SetTimer("RestartTimer",6000,false);
    SendClientMessageToAll(rot,"In 6 Sekunden startet der Server neu!");
    return 1;
    }
    stock Speichern(playerid)
    {
    if(Spieler[playerid][eingeloggt] == 0)return 1;
    if(ress == true)return 1;
    new query[500],Float:Pos[4];
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    GetPlayerFacingAngle(playerid,Pos[3]);
    format(query,sizeof query,"UPDATE prp SET PosX='%f',PosY='%f',PosZ='%f',PosA='%f',Spawn='%i' WHERE Username='%s'",Pos[0],Pos[1],Pos[2],Pos[3],Spieler[playerid][Spawn],Name(playerid));
    mysql_tquery(handle,query,"","");
    return 1;
    }

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

  • SetSpawnInfo(playerid,0,0,Spieler[playerid][PosX],Spieler[playerid][PosY],Spieler[playerid][PosZ],Spieler[playerid][PosA],0,0,0,0,0,0);
    SpawnPlayer(playerid);


    SetSpawnInfo spawnt den spieler schon automatisch...


    und wenn du dann SpawnPlayer machst spawnt er ja bei 0 punkt...



    Fg

  • Da muss was drinnen stehen. Mach bei OnGameModeInit mysql_log(LOG_DEBUG,LOG_TYPE_TEXT);

  • Ich versteh überhaupt nicht wieso du bei OnPlayerRequestClass auf die Daten im Cache zugreifen willst.
    Nicht mal ein Query zum auslesen hast du gezeigt. Selbst wenn es dazu ein Query gibt,wie kannst du sicher sein,dass das letzte Query zum Spieler gehört der OnPlayerRequestClass aufruft ?


    Du solltest das nochmal überdenken. Das wird bestimmt nicht funktionieren sobald du mehr als 1 Spieler bei einem Restart hast. Überhaupt würde ich bei OnPlayerRequestClass keine Daten vom MySQL Server verarbeiten. Das gehört an eine Andere Stelle.


    //Edit:
    Auch die Sache mit dem Restart Timer kann man besser machen. Wer garantiert denn,dass es 6 Sekunden dauert die ganzen Profile zu speichern. Es kann auch nur 1 Sekunden dauern oder sogar mehr als 6 Sekunden. Das wäre dann entweder verschwendete Zeit oder nicht genug Zeit.
    Daher würde ich empfehlen,keinen Timer zu verwenden sondern ein pseudo query an den SQL Server senden wie z.B. "SELECT 1" NACH den Querys zum Speichern der Profile.
    Das dann mit mysql_tquery ( o.Ä. ) an ein Callback senden lassen und sobald es verarbeitet wurde weiss ich, dass alles SQL Kommandos ausgeführt wurden.
    Heißt also so:
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(!IsPlayerConnected(i)) continue;
    Speichern(i);
    }
    mysql_tquery(handle,"SELECT 1","",""); // tquery sagt mir nichts, da wird man aber bestimmt ein Callback angeben können oder eben OnQueryFinish verwenden.

    Einmal editiert, zuletzt von Goldkiller ()