SpawnActor auf Server - Set Master Pose Component

  • Hallo!


    Ich spawne eine Rüstung auf dem Server, diese Rüstung wird dann an den Actor Attached und dann soll die Rüstung noch als SetMasterPose richtig anliegen.

    Jedoch tut es das nicht.

    Es funktioniert nur wenn ich davor ein MultiCast setze, tue ich das, kann ich die Rüstung dann nicht mehr löschen. Weil diese doppelt erzeugt wird.

    Nur die Rüstung auf dem Server wird gelöscht aber nicht die durch MultiCast ebenso erzeugt wird.

    Versuche ich das mit "HasAuthority" zu umgehen, besteht das gleiche Problem wie bei nur dem Server.


    Es ist wie verhext.

    Egal was ich tue, es ist immer eine Sache falsch. :helloween:

    • Offizieller Beitrag

    Vergewissere dich, dass Replicates aktiviert ist in deiner Rüstung. Dann kannst du das auf dem Server replizieren. Kein Multicast.


    Dann würde ich dir empfehlen, statt ein SpawnActor einen AddChildActorComponent zu nutzen. Die haben einen Relativen Transform Wert und ist besser geeginet um etwas anzusetzen. Danach muss trotzdem noch an das Skelett gebunden werden. Aber hier ist ein Multicast nötig! Und wichtig ist, warum auch immer, jedenfalls bei der UE4.21, darf im Actor von der Rüstung Replicates nicht aktiv sein.

    Dieses hat auch den Vorteil, dass das Netz nicht mit unnötigen Daten belastet wird. Denn hier ist es angesetzt ohne es zu replizieren. Wenn es als Actor gespawnt wird, dann werden die location ständig hin und her geschickt.


    Solltest du eine Rüstung wegwerfen wollen und die soll am Boden liegen, dann kannst du dafpür SpawnActor nutzen.

  • Ich würde vom Multicast abraten. Meiner Erfahrung nach hast du mit Multicast immer das Problem daß nicht replizierte Sachen nicht immer ankommen.


    Ganz populäres Beispiel - Du bindest die Rüstung per Multicast an den skeletal mesh. Funktioniert. Jetzt joined ein anderer Spieler - der hat das Multicast nicht mitbekommen und sieht es nicht. Ein zweiter Spieler war während dem multicast "lagged out" und kommt wieder - sieht es nicht.


    Von daher nehme ich fast immer Abstand von Multicast. Generell gilt - was nicht repliziert wird ist nicht vorhanden.


    Ich würde auch nicht den Client spawnen lassen da er dann immer owner ist. Macht zwar oft Sinn, aber wenn du zum Beispiel ne Rüstung wegwirfst damit die ein team Kollege einsammeln kann und du loggst dich aus ist die Rüstung sofort weg. kann auch passieren wenn ein "lagging out" passiert. Spawnt der Server die Rüstung ist sie immer da. Haben 2 Spieler grossen lag uns sammeln ne unique Rüstung auf kann es passieren daß die dann beide haben wenn alles auf dem Client gehandelt wird - klassiches item duping, ist u.U. nicht mal ein Hack. Sollte man zumindest bedenken. Klar kann man programmtechnisch alles abfangen, aber ich würde generell immer alles auf dem Server spawnen - nicht nur wegen cheating sondern auch wegen Verbindungsproblemen und so weiter. Generell hast du mehr Glitches und so wenn clients spawnen, gar nicht mal immer absichtlich von Hackern, sondern einfach weil es schwieriger zu debuggen ist und den Clients verbindungstechnisch oft die dümmsten Dinge passieren.

  • Ich möchte das Blueprint der Rüstung auf dem Character packen, damit ich die Funktion des Blueprints der Rüstung verwenden kann. Vor allem wenn es um den Rüstungsschutz geht, so wie weitere Faktoren und Eigenschaften so wie Veränderungen an der Rüstung (Blueprint).

    Grob gesagt.

    Die Brustrüstung hat einen Stichschutz von 100.

    Der Angreifer hat einen Dolch mit 100 Stichschaden, also hebt sich das auf, wenn der Dolch den Brustbereich trifft und nicht "allgemein" den Charakter. So als globaler Schutzwert.


    Im Grunde sollen die Spieler in meinem Projekt die freie Wahl und Vielfalt haben, unterschiedliche Rüstungen für unterschiedliche Zwecke zu verwenden und alle haben bestimmte Nachteile, bei dem man abwägen muss ob man diese Art von Rüstung und Nachteil verwendet. Entsprechend dafür gibts dann gewisse Vorteile.

    Das funktioniert aber nur, wenn die Rüstung eigenständig funktioniert und nicht allgemein auf dem Charakter, so wie es in fast jedem Spiel der Fall ist.


    Das mit dem Schutz ist nur ein Beispiel, vor allem für das Gildensystem brauche ich diese Rüstung, damit die Spieler visuell unterscheidbar sind und nicht text förmig.

    Die Art der Rüstungsverschönerung und Anpassung ist dann repräsentativ für die Zugehörigkeit und nicht wie üblich, der Name oder Gildenname über dem Charakter (oder in einer anderen Textform).



    ---

    Ja das mit dem Item Duplizieren ist da der Haken welchen ich bemerkt habe.

    Noch dazu, dass bei MultiCast eine art Parallel-Gegenstand erzeugt wird und dieser verweilt dann in der Spielwelt, ohne das dieser gelöscht werden kann.

    Wenn die Rüstung auf dem Server gespawnt wird, kann ich diese dann wieder löschen wenn man diese in den Rucksack packt, so weit so gut und auch richtig.


    Bei MultiCast wird aber noch eine weitere Rüstung erzeugt, mit der man nicht interagieren und diese auch nicht löschen kann, weil diese scheinbar nicht existiert, obwohl doch.


    Meine Rüstung (Blueprint) hat zwei oder mehre Teile.

    1x Static Mesh (für die bessere performance und physic)

    1x Skeletal Mesh (für die erweiterten Funktionen und Eigenschaften)

    Das jeweils andere wird dann ausgeblendet, wenn nicht benötigt wird.


    Ziehe ich eine Rüstung an, wird das Static Mesh unsichtbar und in den Eigenschaften deaktiviert. Dafür wird das Skeletal Mesh sichtbar mit seinen Eigenschaften. Etwa collision Abfrage usw.

    Wird die Rüstung fallen gelassen oder allgemein in die Spielwelt gepackt, wird dafür das Static Mesh verwendet, vor allem auch wegen den LODs usw.

    Das Static Mesh hat auch die bessere Physic die im Spiel sehr wichtig ist.

    ---





    Wie immer ist das Ärgernis das ich nicht weiss wo ich diese Funktion am besten einbaue. So gesehen wäre der MyCharacter perfekt dafür, aber leider funktioniert das wieder nicht mit dem Master Pose Component.

    Mit dem PlayerController muss ich noch schauen ob das da besser funktioniert.



    Grundsätzlich will ich das es auf dem Server gespawnt wird und von dort wird dann die Information an alle anderen Spieler weitergegeben (wenn in Reichweite). Es sollte vermieden werden, dass die Replication über die ganze Spielwelt geteilt wird.

    Grob gesagt. Der Spieler an der Westküste brauch nicht zu wissen, welche Rüstung der Spieler an der Ostküste gerade angezogen hat oder trägt. Erst wenn sich beide in der Mitte treffen, dann soll das nötige repliziert werden.

  • WIe schon gesagt - Multicast würde ich meist vermeiden wenn du da nicht einen verdammt guten Grund für hast.


    Die doppelte Rüstung und das nicht löschen sind auch ein hausgemachtes Problem. Ohne jetzt deinen code zu sehen würde ich sagen du multicastest das an die Clients und lässt die Clients die Rüstung spawnen. Das dumme aber ist daß dann jeder Client seine eigene Rüstung spawnt (Hallo Item duping!) und per default ist wer was spawnt auch Eigentümer davon - sprich dann kann auch nur der jeweilige Client die Rüstung wieder killen.


    Klar kann man das alles programmtechnisch abfangen - nach dem Motto "Von hinten durch die Brust ins Auge" - aber langfristig bringt es dich weiter wenn du einfache schlanke Lösungen verwendest - die sind dann einfacher zu debuggen und durchschauen, performen meist besser und erzeugen weniger traffic.


    PS: Um Master Pose Component zu verwenden mußt du auf ein Mesh referenzieren das eine Master Pose ist. In deinem Character fehlt höchstwahrscheinlich nur die richtige Referenz da er selber kein Master pose mesh ist sondern halt ein character.

  • Ja der Client spawnt die Rüstung nach dem ein anderes Item gelöscht wurde. Das Problem das dadurch Item-Duping ensteht ist mir auch aufgefallen, daher würde ich das gerne anders lösen.


    Bei MasterPoseComponent ist der Mesh des MyCharacters der Master und die Rüstung ist das Target was sich an das Mesh des MyCharacers "kleben" soll.



    Wenn ich das über den PlayerController mache, dann wird das ja nicht an die anderen weitergegeben was ja auch irgendwie Sinnfrei ist, oder habe ich das falsch verstanden?

  • Ich hoffe ihr könnt das darauf soweit erkennen.

    Habe schon diverse Kombinationen durch und nichts führt zu einer Lösung.


    Im Grunde soll der Brustschutz von Clientseite auf dem Server gespawnt werden (ohne MultiCast) an das Mesh von MyCharacter angehaftet werden. So das auch die Animationen und alles korrekt dargestellt wird.

    Derzeit schwebt der Brustpanzer am Character an der richtige stelle aber synchronisiert sich nicht mit den Bewegungen.

    Die Rüstung schwebt einfach am Character gebunden in der Luft und wandert auch mit diesem mit.



    Die Auswahl im Inventar wird vom Widget gemacht, danach wird es an den MyCharacter über den Server weitergeleitet. Inklusive der Variablen die auch repliziert werden.


    Ein Bone wird nicht verwendet, weil die Rüstung auf "Root" steht/gemacht wurde. Daher funktioniert das mit den Bones nicht, habe es schon zig mal versucht.





    Das was mit Skeletal Mesh und Static Mesh gemacht wird ist dazu da um das andere Entsprechend zu deaktivieren.

    Wenn die Rüstung getragen wird, wird nur das Skeletal Mesh benötigt und das Static Mesh nicht, daher unsichtbar.


    Anders wiederum wenn das Stück nicht getragen wird, wird eben das Static Mesh gebraucht und das Skeletal Mesh wird unsichtbar.


    Das Replicated von Skeletal Mesh und Static Mesh wird auch benötigt, sonst ist es unsichtbar.


    Bisher wird aber alles korrekt im Multiplayer repliziert, also nur noch das die Rüstung am Charakter anliegt, fehlt.

    Wird die Rüstung ausgezogen, wird auch das alte Item gelöscht, daher kann ich das duplizieren soweit einschränken.


    Anders ist es leider nicht möglich.

  • Hi, ich glaube wir drehen uns hier ein wenig im Kreis.


    Vorschlag - bitte nicht schlagen wenn du ihn nicht magst (Ich sage immer viel Quatsch und meine Meinung ist auch nicht immer golden):


    Du schaust dir mal ein einfaches Multiplayer Template an. Nur anschauen, ich will das gar nicht bewerten. Letztlich führen ja alle Wege nach Rom. Aber vielleicht mal ein bisschen angucken, überlegen und vergleichen - vielleicht gefällt dir ja der Weg den der Author hier eingegangen ist.



    https://forums.unrealengine.co…yale-tdm-and-classic-mode



    In diesem Template ist das finde ich sehr schön gelöst über einen execute on server custom event. Gefällt mir sehr gut, finde ich sauber.


    Guck mal in den TDM_PAWN -->Replication Graph -->SRV_EquipSecondaryWeapon


    Im Spiel wechselst du Waffen mit "1" und "2" auf dem Keyboard. Variablen "EquipedWeapon" werden sauber repliziert.


    Hier geht das ganze mit attachToComponent, aber klar mit anderen Methoden gehts natürlich entsprechend ähnlich, ob jetzt mit MasterPose oder ähnlich ist vom Aufruf und der Replikation egal. Die Variable ist auch schön sauber und sparsam repliziert. Aufruf auf dem Server so wie es sein soll.


    Obs jetzt ne Knarre ist die attached wird oder ne Rüstung ist ja technisch betrachtet erst mal egal.




    Wie gesagt - ich will dir da jetzt gar nix madig machen - wenn du eine Lösung hast die für dich funktioniert dann ist das auch erst mal pures Gold weil du ja dadurch auch viel gelernt hast.


    Ich würde aber trotzdem mal empfehlen ganz unverbindlich anzusehen wie es andere machen - nach dem Motto "Heute erfinde ich das Rad nicht neu". Ich weiß - graphisch ist das Template sehr simpel und die Pistole auch lieblos attached (Hehe, die Haltung der Arme ist "arm", lol), aber bei dem Template geht es ja darum Multiplayer Mechaniken simpel und anschulich rüberzubringen.

  • ich habe leider keine assets um dir mal das zu bauen. Und kyodai und ich nehmen 2 verschiedene Wege. Es ist besser wenn ich mich daraus halte.


    Hehe, das musst du wirklich nicht. Wie sagt man - alle Wege führen nach Rom. :)


    Wenn alle immer die gleiche Meinung und Ideen hätten wären Foren wohl überflüssig oder wenigstens sehr langweilig. :)

  • Waffe und Schild funktionieren mit dem gleichen System und da komplett Fehlerfrei. Daher war und bin ich sehr verwundert darüber warum das bei der Rüstung so zicken macht.



    Es geht ja auch vor allem darum, dass die Kleidung / Rüstung eine Physic hat. Etwa wenn die Brüste wackeln, wackelt auch der Brustschutz, eben schwächer aber dieser wackelt. Was auf andere Methoden nicht so einfach funktioniert.

    Nur so als Beispiel für Funktionen und Möglichkeiten die man hat.



    Nutzt denn sonst niemand "MasterPoseComponent"?


  • Ja das ist mir bewusst und danke dir für den Link. Nur ist dieser Inhalt zu gewöhnlich und daher in einigen Funktionen nicht brauchbar.

    Das Rad nicht neu zu erfinden, es kommt darauf an was man aus seinem Projekt machen will. Wird es nur eine Kopie von einer Kopie dann eher nicht. Will man etwas neues machen, so wie ich das vorhabe, muss man auch etwas andere Wege gehen.

    Das klingt sehr überheblich, aber ich möchte eben gerne mehr bieten als andere Spiele.


    Bei mir ist es auch so, das die Waffen und Rüstungen eigene Haltbarkeitswerte haben (so wie man es für gewöhnlich kennt), jedoch nicht global (lokal auf dem Charakter) sondern auch physisch am Körper der Spielfigur.

    Das bedeutet das die Haltbarkeit auch bei Treffern schon reduziert wird und wenn die Waffe oder Rüstung zerbricht, ist auch der physische Schutz/Schaden nicht mehr vorhanden. Und das ohne einen globalen Wert zu haben.




    Ich verstehe nicht warum das auf dem Server perfekt funktioniert aber nicht bei den Clients geteilt wird.

    Wenn ich ein MultiCast einbaue bei dem AttachTo, dann ist das zwar richtig bei den Clients aber leider doppelt und falsch, und auf dem Server ist es auch falsch.

    • Offizieller Beitrag

    kyodai nicht das er durcheinander kommt.


    Exaran jeder client benötigt meisten seine eigenen Befehle. Einfach vom Server aus die befehle zu geben geht meistens nicht.

    Beispiel, der client sagt, ich will die Rüstung ansetzen. Dann muss der Server die Rüstung erstmal spawnen, dann ist die Rüstung auf beiden Rechnern da. Erst ab da kann man weiter entscheiden was.mit der Rüstung passiert. Ab hier wird wahrscheinlich auf dem client weiter gehen. Denn du machst besondere Eingriffe, worauf der Server kaum Einfluss hat. Der Server sieht nur ein Abbild vom client. Das bedeutet, der Server setzt die Rüstung richtig an, aber der client hat kein Befehl bekommen. Also hier nochmal vom client richtig ausführen.

  • kyodai nicht das er durcheinander kommt.


    Exaran jeder client benötigt meisten seine eigenen Befehle. Einfach vom Server aus die befehle zu geben geht meistens nicht.

    Beispiel, der client sagt, ich will die Rüstung ansetzen. Dann muss der Server die Rüstung erstmal spawnen, dann ist die Rüstung auf beiden Rechnern da. Erst ab da kann man weiter entscheiden was.mit der Rüstung passiert. Ab hier wird wahrscheinlich auf dem client weiter gehen. Denn du machst besondere Eingriffe, worauf der Server kaum Einfluss hat. Der Server sieht nur ein Abbild vom client. Das bedeutet, der Server setzt die Rüstung richtig an, aber der client hat kein Befehl bekommen. Also hier nochmal vom client richtig ausführen.


    Und wie geht das dann?

    Ich dachte immer das was vom Client an den Server kommuniziert und repliziert wird, wird auch an die anderen Clients verteilt.

    Ich bin da auch ganz kurz davor das es funktioniert.


    Es fehlt nur noch das die Rüstung am Körper aufliegt. Auf dem Server funktioniert das richtig und das ist ja sehr wichtig später für die Schadensberechnung usw. Jetzt fehlt nur noch das es Synchron auf die Clients aufgeteilt wird.

    Ein MultiCast hilft da auch nicht weiter und alle Variablen die damit zutun haben, sind bereits repliziert.


    MasterPoseComponent ist das einzige was es gibt, damit auch die Physic übernommen wird, so wie auch die ganzen Animationen usw. "BinClothToMasterComponent" geht auch nicht.


    Was gibt es da noch für Alternativen?

    • Offizieller Beitrag

    Ich wollte es eigentlich löschen und es verbessern, aber bin noch nicht dazu gekommen. Evtl zeigt dir das wie Replikation sich verhält.

    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    • Offizieller Beitrag

    Ich dachte immer das was vom Client an den Server kommuniziert und repliziert wird, wird auch an die anderen Clients verteilt.

    Da du dies gefragt hast, habe ich dir das Video geschickt. Man könnte jetzt pingelig sein, aber lieber alles richtig stellen, bevor da falsche Gedanken bleiben :) Also, der Server verteilt nicht. Auch wenn ich das im Video so gesagt habe, aber es ist eher anders herum. Der Client muss sich immer alles holen. Wenn eine Variable als replication gesetzt worden ist, dann ist der mit dem Server verlinkt. Der Client holt sich dann den Wert. Kann aber trotzdem die die Variable nutzen um seine Werte zu speichern, was aber sinnlos wäre. Speichern darf nur der Server. Hier muss man aber auch beachten, dass der Server und Client nicht synchron sind. Wenn der Client sagt, speicher für mich diese Variable und der Server macht das dann auch, aber der andere Client war zu schnell um die zu holen, dann hat der was verpasst.

    Ich kann dir nur anbieten per Teamviewer zu helfen. Hier kommen wir irgendwie nicht mehr weiter.