[Mysql] Frage zu Player Position auslesen

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
  • Mahlzeit,
    Und zwar folgendes, ich würde gerne Wissen wie ich am besten die Position des Charakters auslesen kann, damit dieser an seiner letzten Position beim Einloggen wieder Spawnt.

    Mein Script sieht aktuell wie folgt aus ->


    Aktuell spawnt er an einem festen Punkt. Das würde ich gerne ändern, dass er an der letzten Position spawnt.

    Meine Accountspeicher funktion sieht wie folgt aus:

    Die Position wird aktuell auch nicht richtig gespeichert in der Datenbank. Da schaue ich aktuell nach dem Problem.

    Kann ich direkt bei der OnPlayerLogin Function direkt eine Abfrage an die Mysql Datenbank schicken, dass er die Position abfragt und diese ausliest und der Spieler dort gespawnt wird?


    Ich hänge aktuell dort ziemlich auf dem Schlauch ^^

  • Du hast doch sowieso ein System in dem bereits die Daten geladen werden. Dort lädst du dann einfach die Koordinaten aus der Datenbank und beim spawnen verwendest du die Koordinaten.


    Bedeutet konkret in der "Datenbank.AccountLaden" Funktion lädst du die Koordinaten in das myplayer Objekt.


    Bei der Funktion


    myplayer.Spawn(new AltV.Net.Data.Position(-425, 1123, 325), 0);


    benutzt du die Koordinaten aus dem myplayer objekt.


    myplayer.Spawn(new AltV.Net.Data.Position(myplayer.x, myplayer.y, myplayer.z), 0);


    so würde das dann aussehen.



    PS:


    bezüglich deines speicher problems.


    Hast du in deiner DB bei accounts auch die posx, posy, posz hinzugefügt? Als float natürlich.

  • Also die Positionen sind in der Datenbank als Float hinterlegt.


    Aber irgendwie wird die Position nach dem Disconnect auch nicht richtig Gespeichert.
    Fragen über Fragen grade ^^

  • Woran machst du es fest, dass es nicht richtig geladen wird?
    Spawnst du den spieler denn auch an den Koordinaten?

    Die letzte Position wird aktuell generell nicht gespeichert. Er spawnt aktuell auf Position(0,0,0) da keine Einträge in der Datenbank bzgl. der Positionen getätigt wird bzw. keine Einträge erfolgen.

  • Hat das MyPlayer Object auch entsprechend x,y,z properties in die das gespeichert wird? In der Datenbank hast du unter der accounts tabelle posx,posy,posxz genau so geschrieben?


    Vielleicht ein Tippfehler vorhanden?

    SQL Logs die du zeigen kannst?


    Ich kann jetzt auch nur wild spekulieren die aktuellen Informationen sind begrenzt


    PS: Wann wird AccountSpeichern ausgeführt? Auch beim ausloggen?

  • Die Daten werden dort wie folgt Hinterlegt,

    Code
     [ScriptEvent(ScriptEventType.PlayerDisconnect)]
            public static void OnPlayerDisconnect(MyPlayer.MyPlayer myplayer, string reason)
            {
                Datenbank.AccountSpeichern(myplayer);
            }

    Die Daten werden gespeichert sobald er sich eigentlich Ausloggt.

    Einmal editiert, zuletzt von MrNowaaay ()

  • Du musst natürlich bei OnPlayerDisconnect erst einmal die myplayer koordinaten befüllen.

    Das Laden und speichern funktioniert also.


    Nur musst du die Spieler Position beim disconnecten herausfinden und diese in dein myplayer objekt befüllen. Erst danach nutzt du Datenbank Account Speichern.

    Ich kenne die konkreten Befehle aus der Altv Libary nicht aber du brauchst auf jeden fall so etwas die GetPlayerPos (myplayer.playerid) und die Rückgabewerte befüllst du in dein myplayer Objekt.

  • Du musst natürlich bei OnPlayerDisconnect erst einmal die myplayer koordinaten befüllen.

    Das Laden und speichern funktioniert also.


    Nur musst du die Spieler Position beim disconnecten herausfinden und diese in dein myplayer objekt befüllen. Erst danach nutzt du Datenbank Account Speichern.

    Ich kenne die konkreten Befehle aus der Altv Libary nicht aber du brauchst auf jeden fall so etwas die GetPlayerPos (myplayer.playerid) und die Rückgabewerte befüllst du in dein myplayer Objekt.

    Ich hab jetzt eine Funktionen die dafür Sorgt das die Positionen richtig gespeichert werden.

    Kann ich diese so im Login dann auslesen?

    Code
    if (myplayer.SetPlayerPos[0] != 0.0 && myplayer.SetPlayerPos[1] != 0.0 && myplayer.SetPlayerPos[2] != 0.0)
                            {
                                myplayer.Spawn(new Position(myplayer.SetPlayerPos[0], myplayer.SetPlayerPos[1], myplayer.SetPlayerPos[2]), 0);
                            }


    Code
    Hab diese in meinem Object dekladiert als public float[] SetPlayerPos = new Float[4].
  • Beitrag von [DT]midomen ()

    Dieser Beitrag wurde von Whice gelöscht ().
  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Du kannst statt deiner eigenen Koordinaten die Koordinaten des Spieler direkt auslesen, dann sparst du dir einen Schritt. Sprich:

    Und so kannst du beim Laden den Spieler direkt dort Spawnen lassen (oder hinteleportieren, je nachdem wie du willst)

  • Wenn du angst hast dass beim Laden des Spiels die Koordinaten nicht richtig geladen werden kannst du im Constructor deiner Myplayer Klasse die Positionen deines Spawns setzen.


    .Net Doku zu Konstruktoren

    Constructors - C# programming guide
    A constructor in C# is called when a class or struct is created. Use constructors to set defaults, limit instantiation, and write flexible, easy-to-read code.
    learn.microsoft.com


    In deinem Fall wäre es


    public float posx { get; private set; }
    public float posy { get; private set; }
    public float posz { get; private set; }

    public MyPlayer(ICore server, IntPtr nativepointer, ushort id) : base(server, nativepointer, id)
    {
    SpielerID = -1;
    Geld = 0;
    Adminlevel = 0;
    Eingeloggt = false;
    Fraktion = 0;
    Rang = 0;
    posx = xspawn;//Nicht 0 sondern Koordinaten von deinem standard Spawn z.b. Spawn von Neulingen
    posy = yspawn;
    posz = zxspawn;
    }



    public void SetPlayerPos(float x , float y, float z){ //Funktion in die MyPlayer Klasse einfügen

    this.posx = x;

    this.posy = y;

    this.posz = z;

    }



    public static void OnPlayerDisconnect(MyPlayer.MyPlayer myplayer, string reason) {

    myplayer.SetPlayerPos(spielerx,spielery,spielerz);//Koordinaten musst du über einen Befehl rausbekommen. Z.B. bei Samp GetPlayerPos(playerid,...);
    Datenbank.AccountSpeichern(myplayer);
    }





    Damit läuft dann auch alles wenn du dich Schritt für Schritt daran hältst.

  • Nach langem Probieren und herausfinden, hab ich es endlich Hinbekommen das die Positionen gespeichert und wieder ausgelesen werden.

    Der Thread kann wieder geschlossen werden.
    Danke für eure tatkräftige Hilfe.


    #Close.