[WIKI] Multiplayer Synchronisation

    Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Dienste bereitzustellen und die Zugriffe auf unsere Website zu analysieren. Außerdem werden durch unsere Partner Informationen zu Ihrer Nutzung für soziale Medien, Werbung und Analysen erfasst. Weitere Informationen

    • 1. Synchronisation von Componenten

      Durch die Erweiterung von Emergency ist es eventuell nötig weitere Componenten oder noch mehr Eigenschaften zu synchronisieren. Dafür habe ich eine Componente entworfen, die diese Componenten synchronisiert - den "MultiplayerSynchronizationHelperComponent". Dieser Component kann eine Eigenschaft synchronisieren. Hier im Beispiel das Wassertanklevel vom Wassertank-Plugin.



      Der Clou - der Component kann ein beliebiges Entity als Ziel haben. Dadurch kann man weitere Entities an das TLF im Beispiel verlinken und jedes Entity synchronisiert eine zusätzliche Eigenschaft (z.B. das Outtake Level des "watertank::WatertankComponent" oder die Description des "qsf::MetadataComponents"

      Was bedeutet Typen?

      Manche Eigenschaften sind einfach nur ein Wahrheitswert, andere hingegen ein komplexes Wort. Um den Datenverkehr möglichst gering zu halten, kann man hier zwischen verschiedenen Typen wählen


      TypLänge (bits)BezeichnungBeispiele
      BOOL1Wahrheitswert (falsch, wahr)1 (true) 0 (false)
      FLOAT32Gleitkommazahl1.0 1 0.00001 50000.45
      UINT6464Unsigned Integer mit 64 Bits, wird verwendet um EntityIds anzuzeigen0 (CoreEntity) 1 (CameraEntity von Player 0) 100024 5245863 ...
      STRING8+Länge des Strings * 8Kann genommen werden um alles zu synchronisieren. Braucht aber oft mehr Bits200 (8+24 Bits) 2000 (8+32 Bits) 2000.1 (8+48) Hallo (8+40 Bits)

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von KillerConsti ()

    • 2. Alternative zur Synchronisation von Componenten

      Die erste Variante eigent sich vor allem um Properties zu ändern, die von mehreren Entities benutzt werden oder sich häufiger ändern.

      Über ein Script gibt es aber ebenfalls die Möglichkeit Eigenschaften zu Synchronisieren. Auch wenn der Wassertank dafür eher ungeeigent ist, wäre das ein Snippet, welches ebenfalls den Wassertank synchronisiert.

      C-Quellcode

      1. InitNewTrigger("SyncTank", true, true,"MP_Trigger_Runs_On_Hostside");
      2. {
      3. InitConditions();
      4. {
      5. Timer(1);
      6. CompareComponentPropertyToFloatVariable(stlf,"watertank::waterTankComponent","Watertank Level","!=","old_level","list_out_is_not_used");
      7. }
      8. InitEffects();
      9. {
      10. SyncronizeProperty(stlf,"watertank::waterTankComponent","Watertank Level");
      11. WriteComponentPropertyToStringvar(stlf,"watertank::waterTankComponent","Watertank Level","new_level","true");
      12. ConvertStringvarToVariable(old_level,svar(new_level));
      13. }
      14. }
      Alles anzeigen

      In der Zeile 1: wurde der Modus "MP_Trigger_Runs_On_Hostside" ergänzt. Dadurch läuft der Trigger nur auf der Seite des Hosts und nicht auf der Seite der Clients.

      Die Zeile 6 prüft ob das Watertank Level sich verändert hat. Der Effekt wird nur ausgeführt, wenn dies der Fall ist.

      In Zeile 10 wird das Wassertanklevel mit den restlichen Mitspielern synchronisiert

      In Zeile 11 und 12 wird das Wassertanklevel in die Variable old_level geschrieben. Diese wird danach wieder genutzt um Änderungen (siehe Zeile 6) festzustellen