Arma 3
Not enough ratings
Parameter (Übergabe-Werte) in SQF Skripts
By Joshua9797💾
Externe Werte als Einflussfaktor an ein SQF-Skript weitergeben.

Was ist das, wie werden diese verwendet und warum erklärt
   
Award
Favorite
Favorited
Unfavorite
Inhalt
❗[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 Dokument setzt Kenntnisse über SQF-Skript-Dateien voraus. Ein Dokument zu diesem Thema gibt es hier.

Die Abschnitte sind nach Komplexität sortiert.

Inhalt:
  1. Was sind Parameter?
  2. Beispiele für das Prinzip
  3. Funktionsweise
  4. Variablen & Referenzen als Parameter
  5. Standardwerte (Defaults)

1. Was sind Parameter?:
Parameter sind Werte wie z.B. Zahlen, Texte oder auch Referenzen auf Objekte wie z.B. einem NPC.
Diese Werte werden Skript-Extern bestimmt und an das Skript als Einflussfaktor übergeben.
Das bedeutet, dass ein Parameter das Verhalten eines Skriptes verändern kann.
Der Name "Übergabeparameter"[de.wikipedia.org] kommt von dem Vorgehen, dass ein Parameter an ein Skript "übergeben" / "weitergegeben" wird.

Ein Skript ist an sich erst einmal statisch und wird immer das gleiche Machen. Und zwar dass, was in dem Skript programmiert wurde.

Wenn man allerdings die Möglichkeit einbaut, einem Skript Parameter mitzugeben und diese in dem Skript berücksichtigt, so kann man anhand von diesen Parametern das Verhalten des Skripts bestimmen und so dynamisch gestalten.
2. Beispiele für das Prinzip:
Ein Beispiel wäre ein Skript, welches die Aufgabe hat, einen Text auf dem Bildschirm des Spielers anzuzeigen. Dabei könnte der Text, welcher angezeigt werden soll, als Parameter übergeben werden. Das Skript würde sich dann um die Funktion kümmern, einen beliebigen Text anzuzeigen und würde den übergebenen Parameter-Text nur verwenden, aber nicht selbst bestimmen.
3. Funktionsweise:
Übergabe:
Übergeben werden Parameter bei dem Aufruf des Skripts mit execVM in eckigen Klammern:
["meinFreierText"] execVM "test.sqf";
Wenn mehrere Parameter übergeben werden, müssen diese mit einem Kommatrennzeichen getrennt werden:
["meinFreierText", 1001] execVM "test.sqf";

Entgegennahme (In Skript "test.sqf"):
Entgegengenommen werden Parameter mit dem Befehl "params"[community.bistudio.com].

Bei diesem werden nicht die genauen Werte wie bei der Übergabe angegeben, sondern es werden Variablen bestimmt, in welche die Werte kopiert werden.

Die Variablen werden dabei in Anführungszeichen gesetzt, mit Kommatrennzeichen getrennt und von eckigen Klammern umschlossen. Außerdem müssen die Variablen mit einem Unterstrich "_" beginnen.

(der Unterstrich "_" bedeutet für Arma, dass es sich um eine private Variable handelt. Siehe dazu das Dokument „Variablen Bereiche“).

(Auch wenn die Variablen nach dem params Befehl in Anführungszeichen stehen, werden diese direkt nach dem params Befehl als Variablen behandelt und können ohne Anführungszeichen verwendet werden)

Hier wird der Text " 'meinFreierText' " und die Zahl "1001" von außen, in die Variablen "_TextParameter" sowie "_ZahlParameter" im inneren des Skripts kopiert:

//Außerhalb des Skripts: ["meinFreierText", 1001] execVM "test.sqf"; //Im inneren des Skripts "test.sqf": params ["_TextParameter", "_ZahlParameter"];

Welcher Wert in welche Variable kopiert wird, bestimmt die Reinfolge, in der die Variablen stehen. Der erste Wert, welcher bei der Übergabe angegeben wurde, wird auch in die erste Variable bei der Entgegennahme kopiert. Der zweite in die zweite usw.
Man beachte außerdem, dass der Name der Variable, welcher bei dem Befehl params angegeben wird, frei bestimmbar ist.
Die Zeile könnte also auch folgendermaßen aussehen und trotzdem funktionieren:

//Außerhalb des Skripts: ["meinFreierText", 1001] execVM "test.sqf"; //Im inneren des Skripts "test.sqf": params ["_Param_A", "_Param_B"];

Innerhalb des Skriptes kann man anschließend mit den Parametern arbeiten, indem man die Variablen verwendet, in welche der Wert kopiert wurde.
Z.B. wie hier, wo der Parameter "_TextParameter" weiterverwendet wurde, um einen formatierten Hint auszugeben:

//Außerhalb des Skripts: ["meinFreierText"] execVM "test.sqf"; //Im inneren des Skripts "test.sqf": params ["_TextParameter"]; Hint format ["mein Text: %1", _TextParameter];
4. Variablen & Referenzen als Parameter:
Wenn man eine Variable als Parameter übergeben möchte, dann muss diese einfach bei dem Aufruf des Skripts mit execVM angegeben werden:
[meineVariable] execVM "test.sqf";
Auch Referenzen wie z.B. auf einen NPC oder einem Objekt können als Parameter weitergegeben werden, da diese im Prinzip auch nur Variablen sind:
[meinNPC] execVM "test.sqf";
Mit einer Referenz kann man anschließend alle Funktionen / Befehle verwenden wie sonst auch:
//Außerhalb des Skripts: [meinNPC] execVM "test.sqf"; //Im inneren des Skripts "test.sqf": params ["_meinNPCParam"]; _meinNPCParam setDamage 1;

Warum nicht gleich mit der Variable Arbeiten?:
Natürlich wäre es auch möglich gleich mit der Referenz auf das Objekt oder NPC zu arbeiten.
Z.B. direkt mit der Referenz "meinNPC" ohne diese an das Skript als Parameter weiterzugeben.

Ein Grund auch Referenzen als Parameter zu übergeben ist der, dass man im Falle einer Änderung oder einer Wiederverwendung in einer anderen Mission das Skript nicht abändern muss. Man spart sich also besonders bei großen Skripts viel doppelte Arbeit.

Ein weiterer Grund ist die Möglichkeit eines bereits vergebenen Namens. Es kann z.B. sein, dass der Name "meinNPC" in der Mission bereits vergeben ist und deswegen zu Problemen führen kann.

(Der Name, welcher in dem Skript verwendet wird, wie z.B. _meinNPCParam ist nur innerhalb des Skripts sichtbar und kann nicht durch eine gleichnamige Variable / Referenz von außen überschrieben werden. Siehe dazu den Guide „Variablen Bereiche“).
5. Standardwerte (Defaults):
Es ist möglich einen Standard-Wert zu definieren, welcher verwendet wird, wenn bei dem Aufruf des Skripts kein Wert übergeben wurde. Dazu wird der Parameter bei der Entgegennahme in eigenen eckigen Klammern gesetzt und der Standard-Wert wird nach einem Komma angegeben.

Hier als Beispiel der optionale Parameter "_Zahl" welcher mit einer 20 gefüllt wird, wenn bei dem Aufruf des Skripts nur der erste Parameter angegeben wird:
//Außerhalb des Skripts: ["meinFreierText"] execVM "test.sqf"; //Im inneren des Skripts "test.sqf": params ["_Text", ["_Zahl", 20]];
Um den Parameter "_Zahl" zu überschreiben muss ganz einfach wie gewohnt der zweite Parameter mitgegeben werden.
Hier wird z.B. der Standard-Wert von 20 mit dem Wert 36 überschrieben:
//Außerhalb des Skripts: ["meinFreierText", 36] execVM "test.sqf"; //Im inneren des Skripts "test.sqf": params ["_Text", ["_Zahl", 20]];

Aufgrund der Reinfolge, in welcher die Parameter innerhalb des Skripts befüllt werden, sollten optionale Parameter als letztes angegeben werden.
Wenn z.B. Die optionale Zahl als erstes kommt, dann muss diese in jedem Fall befüllt werde, um auch den nicht optionalen Text zu befüllen.

❌Hier ein Beispiel wie man es NICHT MACHT
//Außerhalb des Skripts: ["meinFreierText"] execVM "test.sqf"; //Im inneren des Skripts "test.sqf": params [["_Zahl", 20], "_Text"]; //Nicht gut! //Fehler - Mir fehlt der Inhalt zu "_Text" und in "_Zahl" steht jetzt: "meinFreierText"!