Beim Erstellen von Loadouts gibt es verschiedene Ansätze. Gegebenenfalls gefällt dir ein anderer besser. Hier wird ein klassenbasiertes Loadout aufgrund von Zusammenklicken im Arsenal vorgestellt.
Bestimmte Gegenstände wie Bandagen und Funkgeräte braucht man immer, müsste man so aber sich zusammenklicken – ggf. hilft hier eine Art Vorlage oder ein anderes System.
Anzumerken ist, dass das Zuweisen des Loadouts im Eden-Editor nicht – ohne weitere Zuhilfe – mit einem Respawn funktioniert.
Bevor ihr anfangt, solltet ihr euch überlegen, wie ihr eure Truppstruktur in der Mission aufbaut und welche Loadouts ihr letztendlich braucht – ob diese z.B. klassenbasiert oder einheitenbasiert sind.
Klassenbasiert: jeder Truppenführer, jeder Medic, jeder MG-Schütze etc. hat das gleiche Loadout
Einheitenbasiert: jede Einheit hat ein individuelles Loadout
TTT-Loadouts sind z.B. einheitenbasiert, da sich etwa die Uniform von Trupp zu Trupp unterscheidet und so jeder Truppführer ein anderes Loadout hat.
Des Weiteren empfiehlt es sich, das SQF-Syntax-Highlighting Plugin für den Notepad++ zu installieren. Alternativ könnt ihr Visual Studio Code[2] mit der passenden SQF Erweiterung nutzen. Beides erleichtert ungemein die Übersicht innerhalb eines Skriptes.
Zusätzlich sollte euch bewusst sein, was wir von einem Loadout gewissen Mindestanforderungen erwarten.
Möchte man beispielsweise ein älteres Setting haben, bei dem der einfache Soldate keine Karte und Funkgerät besitzt, schreibt man dies einfach bei den zusätzlichen Informationen.
Schütze
siehe auch QM Loadoutprüdung
wie Gruppenführer, zusätzlich:
wie Schütze / Rifleman, zusätzlich:
wie Schütze / Rifleman, zusätzlich:
In den Fahrzeugen muss kein Vorrat sein. Sollte vergessen werden der standardmäßige Vorrat der Mod-Fahrzeuge zu löschen und nicht zum Loadout passen, müssen diese vom Soldaten ignoriert werden.
Für den Inhalt der Versorgungskisten könnt ihr euch am entsprechenden Abschnitt im Logistik-Artikel orientieren.
Wie Eingangs erwähnt könnt ihr euch diese einfach im Virtual Arsenal zusammenklicken und auch abspeichern. Dazu gibt es glaub ich nicht allzuviel zu sagen, es gibt nur ein paar Dinge, die man beim Virtual Arsenal beachten muss:
Magazin in der Waffe
Das Virtual Arsenal erlaubt euch nicht, ein spezielles Magazin direkt in die Waffe/Werfer zu tun. Wollt ihr z.B. einem Raketenschützen insgesamt zwei Raketen mitgeben (eine in der Waffe und eine im Rucksack), der Rucksack selbst fasst aber nur eine Rakete, so könnt ihr diesem Raketenschützen im Arsenal auch nur insgesamt eine Rakete mitgeben. In der Mission wird diese Rakete jedoch letztendlich automatisch in die Waffe geladen, sodass im Rucksack wieder Platz für eine Rakete wäre.
Fehlende Gegenstände
Es gibt einige wenige Gegenstände von Mods, die im Virtual Arsenal nicht aufgelistet sind. Diese können aber nachträglich in der SQF Datei hinzugefügt werden. Dafür benötigt ihr nur den ClassName des Gegenstands.
Besondere Gegenstände in Rucksack
Es ist im Virtual Arsenal nicht möglich, Gegenstände, die in bestimmte Slots gehören (z.B. GPS, Nachtsichtgerät, Visiere etc.), einfach in eine Weste oder einen Rucksack zu packen.Diese können aber nach dem Exportieren in der SQF entsprechend hinzugefügt werden.
Ausprobieren im Arsenal
Speichert das Loadout ab (mit der Speicher-Funktion oder per Export in Notepad++), bevor ihr das ausprobiert (Try). Sonst wird es passieren, dass Ihr während des Ausprobierens etwas am Loadout ändert.
Nachdem ihr eure Loadouts im Virtual Arsenal erstellt bzw. geladen habt, können wir dieses exportieren.
Drückt den Button "Export" bzw. "Exportieren"
Öffnet eine neue Datei im Notepad++
Drück Strg + V (bzw. Kopieren im Kontextmenü)
Speichert die Datei mit einem passenden Namen und der Endung ".sqf" ab - z.B. "tf.sqf"
In der .sqf Datei alle "this" durch "player" ersetzen.
Empfehlenswert ist ein Ordner "loadouts" im Missionsordner, unter dem alle SQF-Dateien gesammelt werden.
Wiederholt diese Schritt natürlich für alle benötigten Klassen.
Der Inhalt jeder dieser Dateien sollte jetzt in etwa so aussehen:
comment "Exported from Arsenal by TTT";
comment "Remove existing items";
removeAllWeapons this;
removeAllItems this;
removeAllAssignedItems this;
removeUniform this;
removeVest this;
removeBackpack this;
removeHeadgear this;
removeGoggles this;
comment "Add containers";
player forceAddUniform "rhs_uniform_cu_ocp_patchless";
for "_i" from 1 to 2 do {player addItemToUniform "rhs_mag_m18_green";};
player addItemToUniform "ACE_EarPlugs";
player addItemToUniform "ACE_MapTools";
for "_i" from 1 to 2 do {player addItemToUniform "SmokeShell";};
for "_i" from 1 to 2 do {player addItemToUniform "ACE_HandFlare_Green";};
for "_i" from 1 to 2 do {player addItemToUniform "9Rnd_45ACP_Mag";};
player addVest "rhsusf_iotv_ocp_Rifleman";
for "_i" from 1 to 8 do {player addItemToVest "rhs_mag_30Rnd_556x45_M855A1_Stanag_Tracer_Red";};
player addItemToVest "ACE_IR_Strobe_Item";
player addItemToVest "ACE_M84";
player addBackpack "rhsusf_assault_eagleaiii_ocp";
for "_i" from 1 to 7 do {player addItemToBackpack "ACE_fieldDressing";};
for "_i" from 1 to 3 do {player addItemToBackpack "ACE_packingBandage";};
player addItemToBackpack "ACE_tourniquet";
player addHeadgear "rhsusf_ach_helmet_ocp";
comment "Add weapons";
player addWeapon "rhs_weap_m4a1_grip";
player addPrimaryWeaponItem "rhsusf_acc_anpeq15";
player addPrimaryWeaponItem "rhsusf_acc_ACOG3";
player addWeapon "hgun_ACPC2_F";
player addWeapon "ACE_Vector";
comment "Add items";
this linkItem "ItemMap";
this linkItem "ItemCompass";
this linkItem "ItemWatch";
this linkItem "ItemGPS";
comment "Set identity";
this setFace "PersianHead_A3_01";
this setSpeaker "Male01ENG";
Wir müssen diese Dateien ein bisschen anpassen, damit sie für unsere Zwecke nutzbar sind.
Dazu bedienen wir uns der erweiterten Textbearbeitungsfunktionen des Notepad++.
Alle Dateien gleichzeitig mit Notepad++
Alle Dateien markieren → Rechtsklick → Edit with Notepad++
Alle Dateien markieren → per Drag & Drop in Notepad++ ziehen
STRG+H drücken, um das "Suchen und Ersetzen"-Fenster des Notepad++ aufzurufen
Bei "Search Mode" "Reguläre Ausdrücke" einstellen
Wenn wir nur etwas Ersetzen wollen, drücken wir "Replace All in All Opened Documents".
Wir speichern alle geöffneten Dokumente mit Strg + ⇧ Shift + S
Abändern der magischen Variable this
Als Erstes müssen wir für den von uns vorgesehenen Zweck alle "this"-Einträge ersetzen.
Für eine einfache Variante ersetzen wir
this
mit
player
Zusätzlich wollen wir den Abschnitt entfernen, der Gesicht und Sprache festlegt (die letzten Punkte im Virtual Arsenal). Wir bedienen uns hierbei dem Prinzip der regulären Ausdrücke, mit denen sich relativ einfach komplexe Textpassagen beschreiben lassen.
Wir suchen nach
(comment "Set identity";)\r\n(player setFace "(\w)*";)\r\n(player setSpeaker "(\w)*";)
und ersetzen es mit nichts bzw. einem leeren Feld.
Wollt ihr jetzt noch Gegenstände zu eurem Loadout hinzufügen, die über das Virtual Arsenal nicht verfügbar waren, so müsst ihr diese jetzt manuell in das Skript hineinschreiben.
Hierzu stehen euch drei Befehle zur Verfügung:
player addItemToUniform "ACE_MapTools";
player addItemToVest "optic_Aco";
player addItemToBackpack "ACE_fieldDressing";
Wollt ihr einen Gegenstand mehrere Male hinzufügen, so kann man den entsprechenden Befehl zwar auch mehrere Male untereinander hinschreiben, es empfiehlt sich jedoch folgende Schreibweise:
for "_i" from 1 to 3 do {player addItemToUniform "30Rnd_65x39_caseless_mag";};
Hierbei wird das Magazin 3x hinzugefügt.
Um ein Magazin in der Waffe zu haben, muss ein Magazin am Soldaten sein, bevor die Waffe zugewiesen wird.
player addItemToBackpack "RPG32_F";
player addWeapon "launch_RPG32_F";
Wenn man etwa eine Rakete im Rucksack tragen kann, könnte man nach dem Hinzufügen der Waffe erneut eine Rakete zum Rucksack hinzufügen, weil die Vorherige in den Werfer geladen wurde.
Mit folgenden Befehl könnt ihr eine Waffe von scharf auf sicher stellen. Wenn die Waffe bereits gesichert ist, wird sie entsichert.
[ACE_player, currentWeapon ACE_player, currentMuzzle ACE_player] call ace_safemode_fnc_lockSafety;
Damit sind unsere Loadouts nun komplett fertig und ihr könnt sie in eurer Mission testen. Beachtet dabei bitte jedoch, dass diese Loadouts nur übernommen werden, wenn die Einheit auch von einem Spieler gespielt wird – für KI werden diese Skripte nicht aufgerufen.
Damit bleibt mir dann nur noch, euch viel Spaß beim Missionsbauen und Skripten zu wünschen und Fett_Li von Gruppe W zu danken, der TheConen auf die Idee mit der Loadoutvariable gebracht hat und mir damit einiges an Arbeit erspart hat
Das beispielhafte Loadout sieht nun wie folgt aus:
params ["_unit"];
comment "Exported from Arsenal by TTT";
comment "Remove existing items";
removeAllWeapons _unit;
removeAllItems _unit;
removeAllAssignedItems _unit;
removeUniform _unit;
removeVest _unit;
removeBackpack _unit;
removeHeadgear _unit;
removeGoggles _unit;
comment "Add containers";
_unit forceAddUniform "rhs_uniform_cu_ocp_patchless";
for "_i" from 1 to 2 do {_unit addItemToUniform "rhs_mag_m18_green";};
_unit addItemToUniform "ACE_EarPlugs";
_unit addItemToUniform "ACE_MapTools";
for "_i" from 1 to 2 do {_unit addItemToUniform "SmokeShell";};
for "_i" from 1 to 2 do {_unit addItemToUniform "ACE_HandFlare_Green";};
for "_i" from 1 to 2 do {_unit addItemToUniform "9Rnd_45ACP_Mag";};
_unit addVest "rhsusf_iotv_ocp_Rifleman";
for "_i" from 1 to 8 do {_unit addItemToVest "rhs_mag_30Rnd_556x45_M855A1_Stanag_Tracer_Red";};
_unit addItemToVest "ACE_IR_Strobe_Item";
_unit addItemToVest "ACE_M84";
_unit addBackpack "rhsusf_assault_eagleaiii_ocp";
for "_i" from 1 to 7 do {_unit addItemToBackpack "ACE_fieldDressing";};
for "_i" from 1 to 3 do {_unit addItemToBackpack "ACE_packingBandage";};
_unit addItemToBackpack "ACE_tourniquet";
_unit addHeadgear "rhsusf_ach_helmet_ocp";
comment "Add weapons";
_unit addWeapon "rhs_weap_m4a1_grip";
_unit addPrimaryWeaponItem "rhsusf_acc_anpeq15";
_unit addPrimaryWeaponItem "rhsusf_acc_ACOG3";
_unit addWeapon "hgun_ACPC2_F";
_unit addWeapon "ACE_Vector";
comment "Add items";
_unit linkItem "ItemMap";
_unit linkItem "ItemCompass";
_unit linkItem "ItemWatch";
_unit linkItem "ItemRadio";
_unit linkItem "ItemGPS";
comment "Manuell hinzugefügte Gegenstände";
_unit addItemToBackpack "rhsusf_acc_compm4";
_unit addItemToBackpack "ACE_NVG_Wide";
_unit addItemToBackpack "rhsusf_acc_rotex5_grey";
Folgenden Text in die OnPlayerRespawn.sqf schreiben:
private _default = "rifleman";
private _loadoutSQF = ["loadouts\", (player getVariable ["loadout", _default]), ".sqf"] joinString "";
[] spawn compile preprocessFileLineNumbers _loadoutSQF;
In die Init-Zeile der Einheiten schreibt ihr dann z.B. this setVariable ["loadout", "Grenadier"];
Und eure Loadouts im Loadoutordner heißen dann Grenadier.sqf
.
Der Name "onPlayerRespawn.sqf" lässt es vermuten: Diese Datei wird beim Respawn (und beim Spawn) aufgerufen. Damit das funktioniert, muss aber der Respawn richtig eingestellt sein. Das heißt Marker gesetzt und Respawn auf BASE in der "description.ext" oder "Respawn on Custom Position" im EDEN-Editor.
Siehe auch Skriptsammlung