Dedicated Server / Game Mode / Stream Level loading / Player spawn

  • Dedicated Server / Game Mode / Stream Level loading / Player spawn

    Hi,

    ich hätte mal eine Frage bezüglich des Ladens von Levels und dem spawnen von Spielern in Levels bei einem Dedicated Server.
    Zunächst erkläre ich einmal was ich überhaupt erreichen möchte und was ich bereits weiß ;)

    Also zunächst möchte ich Level Streaming verwenden.
    Die Gründe dafür sind zum einen das ich Ladebildschirme (eigene Maps) anzeigen kann in denen sich auch was bewegen kann.
    Ein Open Level sorgt immer für einen Freeze, das möchte ich vermeiden.
    Der andere Grund ist, das ein Dedicated Server ja bekanntlich nur eine Map zur Zeit aktiv haben kann.
    Da ich aber an einem Weltraumspiel arbeite wo man sich in verschiedenen Systemen aufhalten kann (also verschiedene Maps) muss ich das
    ja irgendwie umsetzen können.
    Hier dachte ich mir, das ich einfach per Stream Loading die anderen Maps hinzu lade solange sich Spieler in diesen aufhalten möchten und sie wieder entlade sobald kein Spieler mehr in dem Bereich/Map ist.

    Später im Spiel kann es also auch sein das Spieler sich in verschiedenen Maps ausloggen und auch dort wieder eingeloggt werden sollen.
    Joinende Spieler sollen also in verschiedenen Maps gespawned werden.

    Kommen wir zu meinen Problemen.
    Zunächst starte ich das Spiel beim Client mit der Level MainMenu und im Dedicated Server direkt mit der Level1.
    Da im Main Menü kein Spieler gespawned werden soll, liegt es nahe 2 verschiedene Game Modes zu verwenden.
    Einmal "Game Mode Main Menü" und einmal "Game Mode Spaceship".
    Mit open Level funktioniert der Wechsel der Game Modes super, da diese aktiv werden, sobald man eine Level lädt.
    Bei Stream Level Loading passiert das nicht, da die Levels gemerged werden.
    Man hat also nur einen Game Mode.

    Frage 1 : wie kann man Game Modes manuel wechseln ?

    Diese Game Mode Sache ist aber auch nur eine Idee für die Lösung eines anderen Problems.
    Ich muss beim Starten der Level ja meinen Spieler spawnen, das geht normalerweise über den Game Mode über das Event
    "Event on Post Login", das wiederum wird beim Laden der Level im Game Mode ausgeführt, genau hier beißt sich die Katze in den Schwanz.

    Alternativ kann ich ja auch gerne die Player manuell spawnen.
    Also ich bin im Main Menü Game Mode ohne Player.
    Logge mich auf den Server ein und wenn ich angekommen bin, Spawne ich mein Player.

    Hier habe ich eine Verständnis Frage.
    Ich denke mal das Spawnen des Spieler über den Server läuft ganz normal, korrigiert mich wenn ich falsch liege.
    Ich spawne einfach einen Pawn und diesen Posses ich dann mit dem PlayerController der gejoined ist.

    Frage 2 : Wie bekomme ich mit das ein Spieler neu in eine Level joined wenn das über den Game Mode nicht möglich sein sollte ?
    Frage 3 : Wie kann ich dem Server sagen welcher Spieler jetzt gejoined ist ohne neuen Game Mode ?

    Gleiches gilt für das Stream Loading neuer Maps. Kann ich ganz einfach per Collider eine neue Level laden ? Ich meine ich muss
    ja sicherstellen das der Dedicated Server die Level lädt, nicht der Client, wie kann also der Client "auslösen" das der Dedicated Server
    eine neue Level lädt ?

    Habe das System hinter den Servern noch nicht ganz durchschaut, diese Kombination bringt mich dahher ein wenig zum Grübeln, wäre für Aufklärung sehr Dankbar :)
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
  • Habe vielleicht ein paar mehr Infos gefunden.

    im Game Mode gibt es neben "Event on Post Login" auch das Event HandleStartingNewPlayer.
    Dieses Event wird nicht nur nach dem Login ausgeführt sondern wohl auch beim Seamless Travel.

    Quelle:
    docs.unrealengine.com/en-us/Gameplay/Framework/GameMode

    Auf diesen Weg kann ich also den Spawn der Spieler aktivieren sofern es den Spieler noch nicht gibt.

    Die Idee ist hier einen Game Mode zu verwenden.

    Ich würde dann abfragen in welcher Level sich der Spieler befindet. Im Main Menü würde nichts erzeugt werden.
    In anderen Maps wird der Spieler gespawned sofern dieser keinen Pawn besitzt.

    Bleibt die Frage wie man den Dedicated Server mitteilt das eine neue Level für den Client geladen werden soll.
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
  • Harlyk schrieb:

    Frage 1 : wie kann man Game Modes manuel wechseln ?

    Frage 2 : Wie bekomme ich mit das ein Spieler neu in eine Level joined wenn das über den Game Mode nicht möglich sein sollte ?
    Frage 3 : Wie kann ich dem Server sagen welcher Spieler jetzt gejoined ist ohne neuen Game Mode ?
    Zu Frage 1:
    Ob du den Gamemode manuell wechseln kannst, weiß ich zwar nicht genau, aber ich würde deine Gameplay Map (Persistant Map die auf dem Dedicated läuft)
    komplett leer lassen und sämtlichen Content, inklusive Lichtern, Skyboxes, Render Stuff etc etc. alles in einzelne Streaming Levels aufteilen. Somit kannst du sehr flott zwischen Main Menu Map und Gameplay Map hin und her laden.

    Einmal auf der Gameplay Map angekommen, kannst du den eigentlichen Ladeprozess einleiten (LoadingScreen, Laden der Streaming Levels (oder zB auch Assetpacks / Maps,
    diese kannst du schon vorher im Main Menu laden oder bei Spielstart zB via Asset Manager). Hier musst du selbst priorisieren. Dein Postlogin feuert immer als erstes, noch vor sämtlichen Beginplays.
    Wie du schon sagst, kannst du hier ankommende Spieler abfangen und zB ihre letzte bekannte Location laden (was du natürlich vorher speichern musst), oder vielleicht sowas wie eine Map ID,
    so dass du für genau diesen Spieler das richtige Streaming Level laden kannst. Wie das mit Streaming Levels gehandlet wird im Multiplayer weiß ich leider auch nicht genau.

    Aber So ungefähr würde ich es machen, da ich nicht ganz sicher bin, ob man den Gamemode manuell wechseln kann (innerhalb einer Map).



    Frage 2:
    Es muss immer ein Gamemode existieren der den Spieler registriert. Im Idealfall dann der vom Persistent Level.




    Frage 3:
    Das Postlogin feuert jedes mal, wenn ein neuer Spieler joint (mit Player Controller Referenz).
  • Also laut meiner Recherche kann man den Game Mode nicht manuell zur Runtime ändern.
    Falls jemand doch eine Möglichkeit kennt, immer raus damit.

    Ja wie ich oben schrieb, bleibe ich dann bei einem Game Mode, Lichter, Content usw. würde ich jetzt nicht in extra Maps packen sondern wirklich die Systemabschnitte.
    Neues System = neue Map, sowas nach Content zu trennen könnte ich mir ungünstig vorstellen.

    Das der Game Mode direkt abgefeuert wird, genau das war ja auch das Problem, ich brauche sozusagen eine neue initialisierung sobald Level1 geladen wurde (nach dem Menü).
    Später brauche ich ebenfalls diese Initialzündung sobald ein Spieler die Map wechselt.
    Genau da lag das Problem das normal der Game Mode direkt nur am Anfang feuert und danach nicht mehr.

    Mit dem Event HandleStartingNewPlayer habe ich vielleicht hier eine Möglichkeit gefunden später noch dieses Event auszuführen, das muss ich halt testen.

    Wenn ich nur jetzt mit deinem Spieler dem Spiel Joine und der hat sich das letzte mal in Level 21 ausgeloggt und der Server läuft bereits aber "ohne Level 21", dann stellt sich mir die Frage wie ich denn dem Server sage das er diese Level
    laden soll ?

    Wenn ich im Game Mode Levels lade, werden diese dann direkt vom Server geladen oder vom Client ? (Vermute vom Server da Game Mode ja Serverseitig läuft , oder ?)
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
  • Hallo zusammen

    Verstehe den Sinn nicht, aber das muss ja auch nur der Architekt verstehen :D
    Es ist möglich den GameMode in echtzeit manuell zu wechseln.
    Du machst das mit der GameInstace. Dort kannst du das entsprechende Methode CreateGameModeForURL überschreiben. Hierbei ist die URL die Map URL.
    Ich habe die entsprechende BP function auf die schnelle nicht gesehen. Vielleicht musst du das kurz selbst schreiben.

    Gruss

    // Edit
    Ich habe dir noch kurz die Deklaration rausgesucht
    virtual class AGameModeBase* CreateGameModeForURL(FURL InURL);
  • Hey @phoenix-100

    Weshalb verstehst du den Sinn nicht ?
    Der Ursprungssinn ist das nur per openlevel der Gamemode der eingestellte Gamemode der Level gewechselt wird.
    Bei Stream Leveling geht das nicht.

    Der Grundgedanke war durch die verschiedenen Game Modes das Playerspawn zu definieren, da es Maps gibt wo kein Pawn gespawned werden muss wie im Menü oder aber auf einer Planetenoberfläche/Station.
    Es wäre ein angenehmer Weg gewesen einfach verschiedene Game Modes zu nehmen wo dann speziefische Spawnmethoden drin gesteckt hätten die je nach Map automatisch zum tragen gekommen wären.

    Nun geht das nicht aber man kann wenigstens in einem Game Mode zum richtigen Zeitpunkt Spawnroutinen laufen lassen da ein Event nun auch beim Seamless Travel ausgelöst wird (hoffe ich).

    Wenn du da eine bessere Methode hast oder eine schöne Alternative, dann lerne ich gerne dazu :)
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
  • Harlyk schrieb:

    Der Grundgedanke war durch die verschiedenen Game Modes das Playerspawn zu definieren, da es Maps gibt wo kein Pawn gespawned werden muss wie im Menü oder aber auf einer Planetenoberfläche/Station.

    Es wäre ein angenehmer Weg gewesen einfach verschiedene Game Modes zu nehmen wo dann speziefische Spawnmethoden drin gesteckt hätten die je nach Map automatisch zum tragen gekommen wären
    Ich würde einem Gamemode schon etwas mehr Gewicht zuweisen. Wenn du aber deine Spawnmethoden unbedingt in so viele Klassen aufsplitten möchtest, warum benutzt du dann nicht Components? Ein Component für jede Spawnmethode. Die dann vom Gamemode aus gefeuert werden. Aber verschiedene Gamemodes für verschiedene Spawnmethoden halte ich für nicht sinnvoll. Aber das bleibt natürlich dir überlassen.

    Was auch immer du versuchst, viel Erfolg dabei :)
  • Harlyk schrieb:


    Weshalb verstehst du den Sinn nicht ?
    Ich verstehe das Spielprinzip nicht deswegen habe ich meine Antwort allgemein gehalten.
    Aber jetzt intressiert es mich doch. Kann man denn die Spawnroutine nicht handeln wenn die neue Map bereits im memory ist, also über die generische Spieler initialisierung?
    Und was mich vor allem interessiert, hat meine vorgeschlagener GameMode wechsel in echtzeit dein Problem auf die Weise gelöst wie du dir das vorgestellt hast?

    Gruss
  • @Piontek

    Ja klar Gamemodes können mehr aber aktuell geht es ja erst einmal ums Spawbverhalten. Da kommt sichtlich mehr zu.
    Die Verbindung von Components und Spawnverhalten verstehe ich nicht. Wie stehen diese Sachen in Verbindung ?

    @phoenix-100
    Dein Vorschlag könnte ich nicht testen da ich noch auf der Arbeit bin.
    Aber da es sich um c++ handelt werde ich es wohl auch nicht einsetzen.
    Eine c++ Lösung hatte ich auch schon gefunden, jedoch möchte ich gerne im Blueprint Sektor bleiben sofern möglich.

    Was die generische Spielerinitialisierung angeht, wie soll das funktionieren ?
    Wenn ein Player Joined benötige ich ja das Event und das bekomme ich ja nur über den Game Mode.

    Wenn ich später Level wechsel dann läuft es ja etwas anders ab, Ich benötige zwar immernoch die Info also das Event aber es wird ja nicht immer nötig sein den Spieler neu zu spawnen.

    Wie gesagt wenn ihr alternativen habt dann erklärt sie mir bitte, wenns geht ein wenig genauer damit ich drauf eingehen kann.
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
  • Ach so, du möchtest alles in BP halten alles klar. Das wäre ein Event gewesen, das nach dem Seamless Travel hättest nutzen können um alles so einzustellen wie du es für diese map brauchst. So die Idee.
    Ähnlich wie HandleStartingNewPlayer in BP wird es auch nach dem seamless Travel gezündet.

    Ich wünsche dir noch viel Erfolg.
  • Harlyk schrieb:

    Die Verbindung von Components und Spawnverhalten verstehe ich nicht. Wie stehen diese Sachen in Verbindung ?
    Es geht nicht ums Spawnverhalten. Ein Actor Component kann dir theoretisch alles abnehmen was du willst. Du kannst ihn im Gamemode adden und von dort kontrollieren.
    Dann hast du die gleiche Art von Aufteilung an Spawnmethoden, wie wenn du es mit X vielen Game Modes machen würdest (wovon ich gar nichts halten kann) ^^

    Content:


    Gamemode:


    Actor Component Beispiel:


    Gamemode Beispiel:
  • @phoenix-100
    Danke dir :) ja ich werde es erst einmal mit dem BP Event versuchen, wenn das nicht funktioniert gehe ich über zu deiner Lösung, wäre nur gut wenn ich das mit BP´s umsetzen kann.
    Das liegt nicht daran das ich nicht C++ kann, ganz im Gegenteil, das hat eher was mit meiner Struktur und der zugehörigen Übersicht zu tun.
    Ich danke dir aber schon mal für den Lösungsansatz.

    @Piontek
    Hmm also ich sehe da leider immer noch keinen Zusammenhang sry.
    Du zeigst mir eigentlich gerade eigentlich Custom Events und halt den Actor Component, ein BP in einem BP... beides ist mir durchaus bekannt aber ich sehe nicht das es mir irgendetwas bei meinem Problem nützt.

    Also ja klar werde ich das Spawnverhalten in meinem BP aufteilen, das ist klar.
    Mein vorab Problem bestand aber nicht in der Aufteilung sondern darin das mir das Auslösen des Events gefehlt hat, halt die Initialzündung.
    Jetzt habe ich ja vielleicht einen Weg gefunden.

    Das was ich mit mehreren Game Modes vor hatte ist das die Art des Pawn Spawns (als Spectrator oder eine starre Kamera oder ein Spaceship und die Vorabdefinition von Game Instanzen halt super komfortabel
    in einem Game Mode definiert werden kann, ohne diese muss ich das alles je nach Situation selbst definieren, eine Game Mode nimmt einen da viel Arbeit ab.
    Hinzu käme das jeder Game Mode bei einem Levelwechsel automatisch ausgeführt werden würde. (Was geht wenn man Open Level verwendet)

    Das sind die beiden Knackpunkte, deshalb wollte ich gerne Game Modes verwenden, ein Actor Component und Custom Events helfen mir aktuell nicht wirklich bei diesen Situation, es sei denn ich übersehe etwas.
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
  • @phoenix-100

    Ja , danke dafür :)

    Aktuell habe ich das Gefühl das ich mich im Kreis drehe.
    Habe glaube ich ein paar falsche Schlüsse gezogen.

    Zuerst wollte ich die Game Modes weil sie sich selbst beim Levelstart aktivieren , manuell setzen bringt mich da nicht wirklich weiter.
    Irgendwie habe ich mich da gedanklich verzettelt.

    Habe noch so meine Probleme zu verstehen wie ich den Server dazu bringe den Client in spezielle Maps zu spawnen, HandleStartingNewPlayer löst leider auch nur direkt einmal im Menü aus.
    Denke mal ich muss mal eine Nacht darüber schlafen, denke ich verstehe da noch ein paar Zusammenhänge nicht oder aber ich denke in die falsche Richtung.
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
  • Harlyk schrieb:

    Mein vorab Problem bestand aber nicht in der Aufteilung sondern darin das mir das Auslösen des Events gefehlt hat, halt die Initialzündung.
    Ich weiß immer noch nicht, wo dein Problem ist.

    Wie schon oben genannt, sobald ein neuer Spieler joint, feuert dein Event on Postlogin jedes mal neu. Das Event On Postlogin ist deine Initialzündung mit einer Player Controller Referenz des jeweiligen Spielers.

    Ein und das selbe Event. Deshalb keine Ahnung, welches Event dir fehlt. Es sei denn ich missverstehe dich ^^

    Gruß Dom
  • Harlyk schrieb:

    Das was ich mit mehreren Game Modes vor hatte ist das die Art des Pawn Spawns (als Spectrator oder eine starre Kamera oder ein Spaceship und die Vorabdefinition von Game Instanzen halt super komfortabel
    in einem Game Mode definiert werden kann, ohne diese muss ich das alles je nach Situation selbst definieren, eine Game Mode nimmt einen da viel Arbeit ab.
    Ich wüsste nicht, ein Gamemode dir da viel Arbeit abnehmen würde ^^ Klar, du kannst definieren, welche Klasse gespawnt wird usw,
    aber letztendlich musst du das sowieso manuell definieren, wann und wo welche klasse spawnen muss.
    Das ist aber eigentlich auch nicht viel Arbeit. Sag bescheid wenn du Hilfe brauchst :)
  • Piontek schrieb:

    Harlyk schrieb:

    Mein vorab Problem bestand aber nicht in der Aufteilung sondern darin das mir das Auslösen des Events gefehlt hat, halt die Initialzündung.
    Ich weiß immer noch nicht, wo dein Problem ist.
    Wie schon oben genannt, sobald ein neuer Spieler joint, feuert dein Event on Postlogin jedes mal neu. Das Event On Postlogin ist deine Initialzündung mit einer Player Controller Referenz des jeweiligen Spielers.

    Ein und das selbe Event. Deshalb keine Ahnung, welches Event dir fehlt. Es sei denn ich missverstehe dich ^^

    Gruß Dom
    Mein Problem ist das dies zu früh kommt, bereits im MainMenü, aber zu den Zeitpunkt wird der Spieler noch nicht gespawned und das eigentliche Level wurde auch noch nicht geladen.

    Piontek schrieb:

    Harlyk schrieb:

    Das was ich mit mehreren Game Modes vor hatte ist das die Art des Pawn Spawns (als Spectrator oder eine starre Kamera oder ein Spaceship und die Vorabdefinition von Game Instanzen halt super komfortabel
    in einem Game Mode definiert werden kann, ohne diese muss ich das alles je nach Situation selbst definieren, eine Game Mode nimmt einen da viel Arbeit ab.
    Ich wüsste nicht, ein Gamemode dir da viel Arbeit abnehmen würde ^^ Klar, du kannst definieren, welche Klasse gespawnt wird usw, aber letztendlich musst du das sowieso manuell definieren, wann und wo welche klasse spawnen muss.
    Das ist aber eigentlich auch nicht viel Arbeit. Sag bescheid wenn du Hilfe brauchst :)
    Es nimmt mir bei einem Levelwechsel die Spielerinitialisierung ab die ich bequem und einfach vordefinieren könnte.
    Aber das brauchen wir auch nicht weiter zu vertiefen da es in mein Szenario nicht funktionieren würde.


    Ich denke ich habe jetzt aber mein Problem gelöst. Werde das morgen mal mit meinen Mitstreiter durchprobieren und dann schauen wir mal ob es eine angenehme Lösung ist.
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
Unreal®, Unreal Engine, the circle-U logo and the Powered by Unreal Engine logo are trademarks or registered trademarks of Epic Games, Inc. in the United States and elsewhere.