Informationen austauschen Pre Login

  • Hi hoffe hier ist jemand mit cpp Erfahrung . Ist es möglich im PreLogin schon Daten als Server vom Clienten zu empfangen und zu setzen , so das ich im Postlogin schon alles vom Clienten haben ? Ich hab ein Boolean und möchte diesen direkt setzen ohne großes erst nach der Verbindung von Instanz laden , senden , setzen . Hoffe ihr versteht was ich meine. Also beim Erstkontakt "Handshake" .


    Cheers


    :gamemaker:

    *Lang schon nicht mehr benutzt :lol:

  • Also wenn es Daten geht die du über das Replication System schicken willst: Nein, bzw. wie vieles in Cpp nicht ohne tiefer gehende änderungen. Es gibt jedoch die möglichkeit vom Client mit dem Request Argumente mitzuschicken.

    Und zwar geht das vergleichbar wie in REST dass mit der Travel URL Argumente geschickt werden:


    Diese sind schon im Pre-Login verfügbar. Ein Parameter wird einfach in die Travel URL hinten drangehängt und beginnt mit einem Fragezeichen, darauf folgt der Parameter Name, ein "=" und dann der Parameter als String.

    Also:

    travel_url?param1=foo?param2=bar


    eine Travel URL wäre z.B. die IP oder Domain des Servers, bzw. auch eine Steam oder irgendwie anders Online Sub System spezifische URL.


    Es gibt funktionen um diesen String zu parsen (UGameplayStatics::ParseOption), du musst natürlich beim aufruf schon wissen welcher Typ der Wert haben soll, damit du erfolgreich den als String serialisierten Parameter wieder in deinen eigentlichen Typ zurück parsen kannst.

    Dies wäre der Früheste Zeitpunkt an dem zu Parameter an den Server schicken kannst.


    An sich gibt es 3 Events (in C++):

    PreLogin- Login Request wurde empfangen. Hier könnte man einen Login nicht zulassen.

    Login- Der Player hat sich nun erfolgreich eingeloggt, aber es existiert noch kein Controller, etc. Die Default Implementation erzeugt den PlayerController, von daher vorsichtig sein, beim überladen, da es wichtig ist.

    PostLogin- Der neue Player hat nun einen Controller.

  • Danke die Tomura , sehr ausführlich habe auch schon an den Connect String gedacht . Eigentlich muss der Server nur einen Boolean aufgreifen und nur wieder im neuen Controller setzen ähnlich wie beim Swap Player Event .


    Hintergrund:

    Ich habe keine fertige Lösung gefunden ob der Controller ein lokaler Controller ist also ich erstelle bevor ich auf einen online Server connecte weitere lokale Player über Create Player , die werden auf den neuen Online Server auch erkannt und erstellt, doch kann ich dann nicht mehr unterscheiden wer lokal ist und wer nicht. Geht hauptsächlich um HUD und geteilte Widget Logik.

  • Danke die Tomura , sehr ausführlich habe auch schon an den Connect String gedacht . Eigentlich muss der Server nur einen Boolean aufgreifen und nur wieder im neuen Controller setzen ähnlich wie beim Swap Player Event .


    Hintergrund:

    Ich habe keine fertige Lösung gefunden ob der Controller ein lokaler Controller ist also ich erstelle bevor ich auf einen online Server connecte weitere lokale Player über Create Player , die werden auf den neuen Online Server auch erkannt und erstellt, doch kann ich dann nicht mehr unterscheiden wer lokal ist und wer nicht. Geht hauptsächlich um HUD und geteilte Widget Logik.

    Dafür gibt es eine Funktion:

    https://docs.unrealengine.com/…ocalController/index.html


    Du musst dadurch dass diese Funktion erst im Player Controller ist den Controller zu einem PlayerController casten, also zuerst prüfen off der Controller ein PlayerController ist (ein AI Controller ist immer nur lokal auf dem Server, von daher ergibt die Funktion nur Sinn für Player Controller)

  • Dafür gibt es eine Funktion:

    https://docs.unrealengine.com/…ocalController/index.html


    Du musst dadurch dass diese Funktion erst im Player Controller ist den Controller zu einem PlayerController casten, also zuerst prüfen off der Controller ein PlayerController ist (ein AI Controller ist immer nur lokal auf dem Server, von daher ergibt die Funktion nur Sinn für Player Controller)

    Aber der gibt mir auf jeden Controller true aus


    Edit: ist natürlich möglich das ich es falsch benutze *dead*

  • Ok hab es zwar noch nicht hinbekommen aber hab is locall controller im gammode probiert und im player controller selber , immer das gleiche .


    Hab aber noch ein problem , wie obern geschrieben möchte ich meine Spieler vom Splitscreen in eine Online Session mitnehmen, diese geht auch also ich erstelle die Controller lokal im Menu -> Connect Server -> Server erstellt alle Controller so weit so gut , aber im Log finde ich das


    [2021.03.29-09.01.02:040][292]LogNet: Join splitscreen request: ?Name=Player userId: Invalid parentUserId: DESKTOP-XXXXXX-264DAB5B4574ABCA9AECDB8C75F38A74

    [2021.03.29-09.01.02:040][292]LogNet: Creating child connection with IpConnection_0 parent

    [2021.03.29-09.01.02:042][292]LogNet: JOINSPLIT: Join request: URL=/Game/Game/Maps/Map_MainMenu?Name=Player?SplitscreenCount=2


    Ist es möglich ? Im Login schon meinen splitscreen Spielern einen Namen zu geben ? z.b combiniert aus parentUserId und SplitscreenCount


    Bin in CPP ne 0 deswegen frag ich .

  • Kannst du mal sagen wo und wann du das ganze aufrufst, also welche Funktion/Event steckt dahinter (welcher Zeitpunkt im Gameplay Flow) und auch welches Ergebnis du bekommst (true/false) und kannst du nachvollziehen wo der Code läuft (Server oder Client).

    Und kannst du bitte auch sagen von wo die Referenz deines Player Controllers herkommt. Am besten gleich den Relevanten Teil deines Source Codes zeigen.


    Zu Splitscreen kann ich nichts sagen, da ich keine Erfahrung damit habe.