Blueprint auf Client ausführen, LAN Multiplayer

  • Hallo,
    vielleicht kan einer von euch mir Anfänger helfen. Kann kein C++ und mit Blueprint bin ich am Anfang.
    Folgendes Problem:
    Server Character geht vor die Tür left MouseButton und die Tür geht auf und ich kann durchgehen. Der Client sieht auch das die Tür auf ist und kann auch durch super.


    Client Character geht vor die Tür left MouseButton und die Tür geht auf aber ich kann nicht durch gehen. Der Server sieht das die Tür zu ist und kann natürlich nicht durch gehen.



    Habe im Blue alles auf replicate gesetzt was ich finden konnte. Aber irgendwie will das nicht. Was muss ich machen damit die Tür beim client genauso reagiert wie beim Server.

  • Hallo
    Ich vermute den Grund für dieses Verhalten darin, dass du bei Client1, bei ListenServer als Server spielst.


    Etwas genauer:
    Der Server behält sich die Autorität über die Replicated Objekte. Das bedeutet, wenn du nun die Replicated Türe auf dem Server bewegst, bewegt Sie sich auch entsprechend auf den Clients, wie du es beschreibst funktioniert das ja.
    Wenn du das aber auf Client 2+ machst, geht das nicht mehr, weil er nur der Client ist somit nur die lokale Kopie bewegt. Du musst die Türe also auf dem Server bewegen, der das "echte" Objekt besitzt, nicht auf dem Client.
    Wie machst du das?
    Du erstellst ein Custom Event. Bei diesem kannst du einstellen wo es ausgeführt wird. Du willst hier "Run on Server", damit es auf dem Server ausgeführt wird.


    Gruss

  • Hey super das du geantwortet hast. Danke.
    Leider bin ich ja Anfänger. Das mit dem Custom Event hatte ich schon im Sinn und versucht zu machen. Aber für dummys; Wo soll ich es machen im Türblueprint oder im Levelblueprint? und womit muss ich das dann verbinden?


    Es wäre zwar unverschämt von mir zu bitten, aber wenn du mir das noch erläutern könntest, wäre ich sehr dankbar.


    Liebe Grüße

  • Weder im LevelBlueprint , noch im Tür Blueprint.
    In deinem Controller, wo auch das "Left Mouse Button" Event liegen sollte, kannst du mit [Rechtsklick -> Create Custom Event] ein neues Event erstellen. Dies nennst du bestenfalls "[Server]OpenDoor" und bastelst dahinter deinen Code der die Tür öffnet.
    Danach klickst du auf dein neues Event und wählst oben rechts "Run on Server" in der Selektbox "Replication" aus. Damit sagst du, dass dein Event vom Server ausgeführt werden soll.
    Bei deinem "Left Mouse Button" Event ziehst du nun von "Released" eine ExecutionPipe weg und rufst dein Event "[Server] OpenDoor" auf.


    Viele Grüße
    Sharkbytes

  • Hallo und danke für die Antwort.


    ist vielleicht doch für mich alles zu schwer. In meinem Controller liegt das LeftMouseButten ja nicht. Wenn ich es so mache wie du es beschreibst, würde das ja bedeuten das ich den Gesamten Code noch einmal im Controller machen muss? Und das dann für jede weitere Tür die ich einbaue?
    Im Moment habe ich ja ein Blueprint mit einer Tür und tiggerboxen und im EventGraph den Code. setze ich nun das TürBlueprint in eine Wand ist die ja schon fertig und bisher mit einem Character geht das und dort liegt auch das LeftMouseButton Event. Nichts im Level-, noch im ControllerBlueprint. Hier eine einfache Tür als Bild.jpg


    Gerade das fand ich ja so toll das ich einfach weitere Türen einbauen kann und alles schon fertig ist. Nur im Multiplayer geht es auf dem Client nicht.


    Gruß

  • Hallo , ihr seid lieb, aber ich bekomme das nicht hin.
    Ich kann nicht durch die Tür.
    Aber wenn ich am Server LeftMouseButten drücke sehe ich im Blueprint das es ausgeführt wird. Beim Client wird das nicht ausgeführt. Auch nicht wenn ich es mache wie du sagst SharkByte.
    phoenix-100 owning Connection?


    Gruß

  • Also den Fehler den ich meine ist no owning Connection. Wir müssen das also so definieren, das ein Actor mit owning Connection das Event auf dem Server ausführt.
    Jetzt können wir einfach "Set Owner" machen bei der Tür. Macht aber wenig Sinn, die Türe gehört ja nicht einem Spieler.


    Jetzt könnten wir das Problem auch einfach lösen indem wir das Event, dass du in der Türe hast auf not Repliacted setzen und dieses Event von ausserhalb, dem PlayerController aufrufen.
    Damit das funktioniert müssen wir einen PlayerController erstellen, weisst du wie das geht bzw. hast du schon einen eigenen erstellt?

  • Gut, mal eine vorläufige Lösung bevor wir zur richtigen kommen.



    Also, das ist der PlayerController. Wenn ich X drücke soll die Türe geöffnet werden. Vorläufig soll einfach die eine Tür in der Scene geöffnet werden (schau das du nur eine in der Scene hast oder wähle sie per Tag aus).
    Das Event habe ich Server genannt. Es ist On Server. Tür öffnen ist mein Event im Tür Blueprint, also das Event das du vorhin dort erstellt hast und auf nicht repliacted gesetzt hast.

  • Wir sind leider noch nicht ganz fertig...
    Weil bis jetzt funktioniert das nur mit dieser einen Tür. Die Idee wäre, dass du bei der Tür eine Collision Box hast, wenn der Spieler in dieser Box drin ist, wird ihm angeboten per Taste diese spzifische Tür zu öffnen.
    Falls das deiner Idee entspricht, musst du bei der Tür einen Box Collision Component hinzufügen und so Skalieren bzw. platzieren das der Spieler drin stehen kann. Anschliessend musst du den PlayerController wiefolgt anpassen.



    Gruss