Arma 3
Not enough ratings
Multiplayer Scripting (Lokales vs Globales Scripting) 🚧WIP
By Joshua9797💾
Besonderheiten beim Skripten in Multiplayer-Mission.
  • Server und Client,
  • Lokal und Global
   
Award
Favorite
Favorited
Unfavorite
Inhalt
🚧Work in Progress

❗[Disclaimer] Es ist keinesfalls meine Absicht Falschinformationen zu verbreiten. Es kann allerdings dennoch sehr leicht vorkommen, dass ich mit meinen Erklärungen nicht komplett oder sogar ganz falsch liege. Ich lerne selbst noch SQF und kann dementsprechend nicht für eine 100% Korrektheit garantieren.

❗Dieses Thema ist besonders kompliziert bzw. abstrakt und wird in anderen Quellen wie z.B. der offiziellen Seite von Bohemia Interactive über dieses Thema[community.bistudio.com] besser und ausführlicher erklärt.

In diesem Dokument werde ich versuchen, ein grobes Verständnis für den Unterschied zwischen Lokalem- und Globalem-Scripting zu schaffen, da dieses Thema besonders wichtig im Zusammenhang mit Skripts auf einem Multiplier-Server ist.


Inhalt:
  1. Allgemein
  2. Begriff: Lokal & Global
  3. Variablen beim MP-Scripting (publicVariable)
  4. remoteExec (Senden von Skripts und Funktionen)

1. Allgemein
Man stelle sich folgende vereinfachte Gegebenheit vor. Der Server, auf dem das Spiel läuft, ist ein eigener PC mit allen Eigenschaften eines normalen Spielers. Wenn man also einen Monitor, Maus, Tastatur und Lautsprecher an diesen Server anschließt, dann kann man wie jeder andere Spieler auch, über die Karte laufen, seinen Körper bewegen und anderen Spielern über die Lautsprecher zuhören.

Wenn man im "Einzelspieler", z.B. im Editor, eine "Mehrspieler Mission" startet, dann "hostet" man das Spiel selbst auf dem eigenen PC und wird dadurch selbst zum Server. Dadurch das der Server wie oben beschrieben auch nur ein weiterer Spieler ist, kann man das Spiel ganz normal spielen.

Wenn man aber eine Multiplayer Mission auf einen echten dedizierten Server startet und sich selbst mit einem weiteren PC mit diesem verbindet, wird die eigene Maschine als Client bezeichnet.

Ein Server hat die Aufgabe, Informationen an die Spieler zu verteilen wie z.B. die Position der anderen Spieler oder die Geschwindigkeit eines Fahrzeugs.

Ein Client verbindet sich mit einem Server und teilt diesem durchgängig Informationen wie z.B. Geschwindigkeit und Position über einen selbst mit.
2. Begriff: Lokal & Global
Das folgende ist das aller wichtigste zu verstehen:

Es gibt Funktionen wie z.B. "Hint"[community.bistudio.com], welche einen "Lokalen" Effekt haben. Das bedeutet, dass die Funktion, nachdem sie aufgerufen wurde, nur auf der jeweiligen Maschine Auswirkungen hat, auf der diese aufgerufen wurde. Z.B. nur auf dem Server oder nur auf dem Client.

Im Gegensatz dazu gibt es Funktionen wie z.B. "Join"[community.bistudio.com] welche einen "Globalen" Effekt haben. Eine Globale Funktion, wird auf jeder Maschine einen Effekt haben (Server und alle Clients), auch wenn diese z.B. nur auf dem Server oder nur auf einem einzelnen Client aufgerufen wurde.

Ob eine Funktion einen Globalen oder Lokalen Effekt hat, kann man an dem jeweiligen Icon auf der jeweiligen Wiki Seite von Bohemia Interactive sehen.
Z.B. hier auf der Seite der Hint Funktion[community.bistudio.com] ein LE = Lokaler Effekt:


Oder hier auf der Seite der Join Funktion[community.bistudio.com] ein GE = Globaler Effekt:

Beispiele:
  • Ein Hint, welcher auf dem Server aufgerufen wird, hat ausschließlich auf diesem einen Effekt. Wenn also z.B. ein "Hallo" als Hint ausgegeben werden soll, und dieser nur auf dem Sever aufgerufen wird, dann erscheint zwar ein "Hallo" als Hint auf dem Bildschirm des Servers, aber die einzelnen Clients werden davon nichts mitbekommen.

  • Wenn derselbe Hint ausschließlich auf einem einzelnen Client aufgerufen wird, dann wird zwar dieser Client die Nachricht sehen, nicht aber die anderen Clients oder der Server.

  • Wenn die Funktion Join auf dem Server aufgerufen wird, dann hat dies auch Auswirkungen auf die anderen Clients. Im Genauen wird sich die jeweilige Einheit, für alle Spieler und auch für den Server sichtbar, der im Join angegebenen Gruppe anschließen.
    Dasselbe geschieht, wenn die Funktion ausschließlich bei einem einzelnen Client aufgerufen wird.
3. Variablen beim MP-Scripting (publicVariable)
❗Dieser Abschnitt setzt Kenntnisse über öffentliche und private Variablen voraus. Ein Dokument zu diesem Thema gibt es hier: „Variablen Bereiche“.

(Folgende Begriffe müssen auseinandergehalten werden):
  • „Privat“ und „Öffentlich“

  • „Lokal“ und „Global“


Problem:
Eine öffentliche Variable, welche auf dem Server erstellt/angelegt/definiert wurde, ist nur auf diesem sichtbar. Genau das gleiche, wenn eine öffentliche Variable bei einem Client erstellt wurde. Dann ist diese auch nur für diesen Client sichtbar.

Das liegt daran, dass eine Variable immer Lokal angelegt wird. Sie ist also für die anderen Maschinen im Netzwerk nicht sichtbar.

(Es ist unmöglich (und unlogisch) das private Variablen global (bei allen Maschinen) bekannt sind)

Hier ein Beispiel von einer öffentlichen Variable, welche nur auf dem Server angelegt wurde. Nicht aber bei den Clients:


Damit jeder (Server und Clients) die Variable kennen und auf den Wert in dieser zugreifen können, muss die Variabel also auch bei jedem einzeln erstellt werden:


Z.B. könnte die Variable in der „initPlayerLocal.sqf“[community.bistudio.com] angelegt werden.
Siehe dazu den Unterpunkt „Event Scripts (Besondere .SQF Dateien)“ in dem Dokument „SQF Skripts als Datei verwenden“ hier.


Kompliziert wird es, wenn sich der Wert einer öffentlichen Variable während des Spiels entweder auf dem Server oder bei einem der Clients verändert.

Wenn bei jedem die Variable wie in dem Beispiel oben einzeln erstellt wurde, dann ist es wichtig zu verstehen, dass jeder eine eigene Kopie dieser Variable hat.

Da eine Variable Lokal ist, wird bei einer Zuweisung eines neuen Wertes dieser nicht an die anderen Spieler weiterkommuniziert.
(Die Variable wird nicht synchronisiert)

Damit erhält z.B. der Server einen anderen Wert, wenn er auf die Variable zugreift, wie wenn ein Client auf den gleichen Variable-Namen zugreift:



Lösung (publicVariable):
Wenn eine Variable bei jedem Client (Global) bekannt/vorhanden bzw. synchronisiert werden soll, dann muss diese Variable zu den jeweiligen Clients „gesendet“ werden. Dazu kann man die Funktion „publicVariable“[community.bistudio.com] verwenden. Diese nimmt den Wert einer öffentlichen Variable und sendet diesen über das Netzwerk an alle anderen Spieler.

Wenn die Variable bei einem beliebigen Spieler noch nicht bekannt ist, dann wird diese neu angelegt.
Wenn eine Variable mit einem passenden Namen bereits existiert, dann wird der alte Wert mit dem neuen Wert überschrieben.

PublicVariable kann dabei nur Variablen versenden, welche bereits angelegt wurden.
Der erste Schritt ist es also, eine Variable zu erstellen, gegebenenfalls einen Wert zuzuweisen und im Anschluss mit publicVariable abzuschicken.

Ausgeführt werden kann die Funktion mit dem Befehl „publicVariable“ gefolgt von dem Namen der Variable in Anführungszeichen.
Z.B.:
meineVariable = 1; publicVariable "meineVariable";
(publicVariable kann keine „privaten“ Variablen versenden!)


Die Funktion publicVariable sendet den aktuellen Wert nur ein Mal pro Aufruf.
Das bedeutet, dass man nach jeder folgenden Änderung der Variable die Funktion publicVariable erneut aufrufen muss:
meineVariable = 1; publicVariable "meineVariable"; meineVariable = 2; // Muss erneut gesendet werden publicVariable "meineVariable";
4. remoteExec (Senden von Skripts und Funktionen)