Blueprint Multiplayer Kartne werden doppelt gespawnt

  • Mein!


    Mein Blueprint kommt später bin grade unterwegs.





    Ich habe folgendes Problem ich habe eine Spiel gebaut das eine Art Kartenpuzzel ist. Das ist erstmals nur ein Prototyp und werde es später nochmal komplett neu machen da ich ja ständig was neues lerne.

    Im Singleplayer hat die ganze Logik auch funktioniert.

    Beim umstellen auf einen Multiplayer hab ich so meine Probleme bekommen.


    Ich habe eine Funktion mit der ich 5 Karten in der Hand Spawnen lasse und neun Felder wo die Karten platziert werden. Dazu eine Funktion das die Karten, wenn sie nicht auf einem Feld landen zurück auf die Hand gehen. Das alles hatte ich im GameMode. Da ich jetzt auf Multiplayer umgestellt habe, hab ich gemerkt das dies im GameMode nicht mehr geht. Also habe ich die Funktionen in meinen Player Controller verschoben weil ich dort bereits Variablen hatte die ich zum erstellen der Karten und des Feldes habe.


    Nun habe ich ja nur 2 Spieler. Diese 2 Spieler speichere ich in einem Array und habe meine Hand Spawn Funktion so umgeschrieben das die Karten für die beiden Spieler spawnen.


    Die Karten spawnen direkt am Spielstart also durch "Begin Play".


    Das alles passiert nur auf dem Server. Das Problem ist jetzt das beim Spielstart 2 Spieler joinen und dadurch der PlayerController auch 2 mal erzeugt wird und die Funktion zum Spawnen der Hand 2 mal erfolgt. So hat halt jeder Spieler 10 Karten.


    Wie schaffe ich das der Client der Spieler den anderen Controller nicht starten lässt? Der PlayerController des jewals anderen wird ja in dem eigenen Clienten nicht gebraucht...


    Jemand eine Idee?



    Meine erste Idee war es durch einen Vergleich zu überprüfen ob der aktive Player Controller der selbe ist wie an Stelle eins des Arrays und dann die Karten für Player 1 zu spawnen und wenn es nicht der selbe ist für Player 2. Dadurch ist mir dann erst aufgefallen das der PlayerController von beiden in beiden Instanzen des Spiels aktiv ist.

  • Scheinbar verstehe ich was den Multiplayer angeht irgendwas falsch.

    Egal was ich bei den Costum Events angebe ob, "Run on Server, Run on owning Client oder Mulitcast"

    Der Karten werden immer sowohl vom Server als auch vom Client gespawend. Habe manchmal jede Karte 3-4 mal da liegen je nachdem was ich verwende.


    Habe nun einfach mal nichts davon verwendet und lasse das Spiel einfach wie im Singleplayer die Karten Spawnen.


    Hab den erstellten Karten dann auch einen "Owner" gegeben. Beim klicken auf die Karten spuckt mir ein "Print String" dann auch aus das von den zwei Karten eine dem Client1 und die andere dem Client2 gehört.


    Wie ich es jetzt mache das "NUR" der Server die Karten Spawned verstehe ich einfach nicht.

    Benutze ich z.b. "Run on Server" bekomme ich 4 Karten, 2 die jewals dem ersten Spieler gehören und 2 die dem zweiten Spieler gehören. Die KArten selbst sind auf "Replicate" gestellt, stelle ich das aus, wird keine Karte gespawned.


    Ich raff die Logik dahinter so gar nicht, und die Videos zu dem Thema helfen nicht wirklich :D


    Habe einfach als Test mit der Taste F einen Cube Spawnen lassen. Mit "Run on Server", funktioniert ohne Probleme...


    Externer Inhalt blueprintue.com
    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.


    (Die Funktion ist natürlich in ihrem eigenen Graphen)

  • Auf dem Server hat jeder Spieler einen PlayerController bzw. PlayerState. Also die Funktion wird bei 2 Spielern zweimal ausgeführt.

    Du spawnst ja nicht fix zwei Karten, sonder du loopst über den Tag. Wenns davon zwei Actors gibt werden pro Controller zwei Karten erstellt also:


    1 Spieler * 2 Tags = 2 Karten

    2 Spieler * 2 Tags = 4 Karten

    3 Spieler * 2 Tags = 6 Karten


    Usw.


    Gruss

  • Danke erstmal für die Antwort


    Du beziehst dich wahrscheinlich mit den 2 Tags auf Hand und Hand2 oder? Die Reihe mit Hand2 ist nicht verbunden und wird gar nicht ausgeführt.

    Diese Reihe hat einen anderen Spawnpunkt und anderes Material. Dieser Weg ist eigentlich für den zweiten Spieler festgelegt.


    Diese Spawn Mechanik ist im PlayerState der ja pro Spieler einmal besteht. Wenn ich das nun über den Server auslösen lasse, sollte eigentlich jeder nur eine Karte spawnen.. Denke ich.

    Selbst wenn ich das so mache und im DebugMonitor der Karten nachschaue sehe ich dort das sowohl der Server als auch Client Karten spawned trotz Switch has Authority oder Run in Server

  • Ja das ist ja soweit auch richtig. 5 Target Points mit dem Tag.


    Jeder Spieler spawnt so an 5 verschiedenen stellen 1 Karte. Also bei 2 Spielern 10 Karten.


    Aber in jeder Spielinstanz spawnen 10 unabhängige karten also insgesamt 20. Wenn ich einen dritten Spieler hinzufüge sind es 30. Lasse ich es aber bei 2Spielern über den Server laufen sind es insgesamt 40 Karten.

  • So sollte es sein.


    Wenn ich dich jetzt richtig verstehe ist das so:


    Ich sitze bei mir zuhause und habe das Spiel offen und ein andere sitzt woanders und hat das Spiel auch offen. Wir sind beide über einen Server verbunden.

    Wenn ich die Karten spawne durch meinen PlayerState sollten 5 Karten auftauchen. Aber aus irgendeinem Grund lässt mein Spiel auch 5 für seinen PlayerState spawnen?


    Ich hab das so verstanden das durch die kommunikation ich von dem anderen Playerstate?gar nichts weiß und dieser in meinem Spiel nichts auslösen sollte. Da dies über dem Server läuft

  • So sollte es sein? Du hast doch geschrieben das es genau so nicht sein sollte?

    Du schreibst ja auch, es sollten nur 5 Karten gespawnt werden. Du machst das ja über BeginPlay. Wenn du es über eine Action ausführst, wird das nur noch auf deinem Controller ausgeführt.

    Du hast das schon richtig verstanden, aber du hast ja zwei Clients. Beide sagen dem Server, "Spawne jetzt bitte 5 Karten", der macht das und replicated diese Karten an Alle.

    Wenn du das nur auf deinem machen willst, darfst du das nicht auf BeginPlay machen.

  • Ok, dann haben wir uns wahrscheinlich beide nicht ganz verstanden. Ich werde es wenn ich heute abend zuhause bin mal mit was anderem als Begin play versuchen.


    Also um das nochmal klar zu stellen.


    Beide Spieler finden sich zu einem Game zusammen und sagen dem Server bitte spawne mir 5 Karten aus meinem Deck(array). Für Spieler 1 auf der linken Seite(Tag Hand), für den Spieler 2 auf rechten Seite(Tag Hand2).

    So sollte das passieren. Die Karten des anderen Spielers werden dem anderen natürlich auch angezeigt, aber mit einer Rückseite, dazu komme ich aber erst später.

  • Moin,


    also mit was anderem als Begin Play funktioniert es.

    Muss dann nur mal schauen wie ich es anstelle das es auch geht wenn die Runde startet, aber das mache ich wenn ich sowas wie "Find Game" Funktion drinne habe.



    Wir ich es allerdings hinbekomme das die Hand für den einen Spieler auf der anderen Seite gespawned wird weiß ich immernoch nicht.

    Da ja jeder Client und der Server scheinbar von jedem PlayerController, Player Pawn oder so wissen.


    Also weiß ich nicht wie ich dem Server klar mache:" Hey das ist Spieler 2, packe seine Karten bitte auf die rechte Seite."

  • Hallo


    Nein die wissen nichts voneinander. Du Spawnst die Dinger ja auf dem Server. Auf dem Server gibt es alle Controller und alle Controller haben das BeginPlay event. Wenn du das per User Input machst, gibt es nur ein Event auf einem Controller.

    Bei Spielen wir Hearthstone hat der Spieler ja immer das untere Deck (glaube ich zumindest). In diesem Fall gibt es auch keinen Grund

    die Karten zu replicaten. Das wäre auch auch hinsichtlich Cheats viel sicherer. Falls das für dich überhaupt eine Rolle spielt. Wenn du das trotzdem mit Beginplay machen willst, solltest du das ohne die Tags machen, weil die sind ja immer am selben Ort.


    Gruss

  • Bei Spielen wir Hearthstone hat der Spieler ja immer das untere Deck (glaube ich zumindest). In diesem Fall gibt es auch keinen Grund

    die Karten zu replicaten. Das wäre auch auch hinsichtlich Cheats viel sicherer. Falls das für dich überhaupt eine Rolle spielt.

    Also das ist etwas das ich auch noch ausprobieren wollte, nur da hatte ich keinen Anhaltspunkt wie ich das mache das dir Sicht der Spieler ja sogesehen spiegelverkehrt ist.


    Da dachte ich das mit den Karten Links und rechts wäre einfacher ?


    Wenn ich das mit den Tags wegnehme dann wissen die Karten aber ja gar nicht mehr wo sie spawnen sollen.

  • Wenn du willst, dass alle die gleiche Perspektive haben, könntest du nur die Werte Replicaten und nicht die Karten selber. Der Server Spawnet dann die entsprechenden Karten lokal auf dem Client. Die eigenen Karten unten und die gegnerischen immer oben.


    Wenn du links und rechts haben willst. Kannst du die Karten basierend auf dem PlayerController spawnen und zwar auf dem Server und diese dann Replicaten. Links PlayerController0 und rechts PlayerController1.

    Du kannst Karten auch einfach per Location spawnen. Das kannst du natürlich auch mit deinen Slots machen, du musst sie halt irgendwie anderst nennen, damit du die richtigen Slots durch den passenden Controller aussuchen kannst.


    Gruss

  • Wenn du links und rechts haben willst. Kannst du die Karten basierend auf dem PlayerController spawnen und zwar auf dem Server und diese dann Replicaten. Links PlayerController0 und rechts PlayerController.

    das habe ich bereits versucht. Vielleicht war mein Weg falsch.


    Ich habe im PlayerController über den Server mit einer Branch gecheckt ob es der erste oder zweite PlayerController ist und er hat mir bei beiden Spielern immer den ersten ausgegeben.

    Vielleicht muss ich das anders abfragen aber ich weiß nicht wie das gehen soll.