Loadouts für vorplatzierte Einheiten
Loadouts in 3DEN bearbeiten
Am einfachsten hast du es, wenn du die KI schon im Editor platziert hast (was allerdings nicht immer die sinnvollste Variante ist!)
Dann reicht es aus, wenn du im Rechtsklick-Menü der Einheit auf „Edit Loadout“ klickst. Damit öffnet sich das Arsenal, in dem du die Loadouts komfortabel anpassen kannst.
Wenn du das Loadout mehrerer Einheiten ändern willst, kannst du dafür entweder gleich mehrere Einheiten auswählen und dann auf „Edit Loadout“ klicken (damit ändert sich das Loadout aller angewählter Einheiten zugleich) oder du kopierst die Einheit, nachdem du sie angepasst hast oder du speicherst das Loadout im Arsenal ab und lädst es bei der nächsten Einheit wieder.
Grenzen der Methode Diese Methode ist nur für Einheiten sinnvoll, die bereits im Editor genau so platziert werden, wie sie später im Spiel erscheinen sollen.
- Wenn du eine Fahrzeugbesatzung mit dieser Methode bearbeiten willst, musst du diese zunächst aus dem Fahrzeug herausholen, das Loadout bearbeiten, und sie dann wieder hineinsetzen.
Loadouts für über Scripts gespawnte Einheiten
Poppy-Loadouts per Eventhandler zuweisen
Auch KI-Einheiten kann mit Poppy ein Loadout hinzugefügt werden. Dazu wird der Befehl
[_target, _loadout] call Poppy_fnc_applyLoadout;
verwendet. Dabei wird dem Ziel (_target
) ein in der CfgLoadouts definiertes Loadout (_loadout
) zugewiesen.
Damit die Einheiten das Loadout beim Spawn zugewiesen bekommen, ist ein Klassen-Eventhandler nötig:
[_className, _eventName, _eventFunc, _allowInheritance, _excludedClasses, _applyInitRetroactively] call CBA_fnc_addClassEventHandler
Ein Klassen-Eventhandler funktioniert wie ein Eventhandler, nur dass er jeglicher Einheit einer Klasse hinzugefügt wird, die bereits existiert oder noch gespawnt wird. Wir benötigen dabei einen EH des Typs init
. Ein init-EH triggert dann, wenn die Einheit initialisiert wird, also beim Spawn. Im Eventhandler fügen wir dann das Poppy-Loadout mithilfe der obigen Funktion hinzu.
Dabei muss die Lokalität beachtet werden: Die Funktion sollte jeweils nur dort ausgeführt werden, wo die Einheit lokal ist, nicht auf allen Clients. Deshalb beschränken wir die Anwendung des Loadouts im Script auf den Client, auf dem die Einheit lokal ist.
Beispiel
Nehmen wir an, wir wollen in unserer Mission feindliche CSAT-Soldaten haben, die aber mit den AK12 aus dem APEX-DLC ausgestattet sind.
Als Grundlage wählen wir dafür den Rifleman der CSAT. Dieser hat den Klassennamen O_Soldier_F
.
Nun müssen wir zunächst die Poppy-Loadouts erstellen. Dies wird an anderer Stelle erklärt, weshalb hier nicht weiter darauf eingegangen werden soll. Gehen wir aber davon aus, dass wir schließlich in der CfgLoadouts eine Klasse namens O_Soldier_F
definiert haben, die die erwünschten Änderungen enthält.
Der nächste Schritt ist es, den Class-EH zu erstellen. Dafür öffnen wir die Datei init.sqf
aus dem Missionsverzeichnis und fügen folgenden Code ein:
["O_Soldier_F", "init", {
_unit = (_this select 0);
if (local _unit) exitWith {
[_unit, "O_Soldier_F"] call Poppy_fnc_applyLoadout;
};
}, false, [], true] call CBA_fnc_addClassEventHandler;
Dies sorgt dafür, dass alle Einheiten vom Typ O_Soldier_F
, die gespawnt werden, das Poppy_Loadout von der Maschine erhalten, auf der sie lokal sind.
Wir können auch noch einen Schritt weiter gehen, und allen Einheiten der CSAT ein Loadout zuweisen, sofern für sie eines in der CfgLoadouts definiert ist.
Dafür müssen wir zunächst herausfinden, welche Basisklasse die CSAT-Einheiten haben.
Dazu machen wir im Editor einen Rechtsklick auf einen CSAT-Soldaten, klicken „Find in Config Viewer“ und schauen uns in der Zeile unten bei Parents:
an, von welchen anderen Klassen O_Soldier_F
erbt. Wir stellen fest, dass alle CSAT-Soldaten von O_Soldier_base_F
erben. Wir können nun hierfür einen Klassen-Eventhandler erstellen, der auf die untergeordneten Klassen weitervererbt wird. Wir müssen dann im EH-Code abfragen, ob für die Soldaten-Klasse ein Loadout hinterlegt ist.
["O_Soldier_base_F", "init", {
_unit = (_this select 0);
if ((local _unit) && (isClass (missionConfigFile >> "CfgLoadouts" >> (typeOf _unit)))) then {
[_unit, typeOf _unit] call Poppy_fnc_applyLoadout
};
}, true, [], true] call CBA_fnc_addClassEventHandler;
ACE-Arsenal-Loadouts per Eventhandler zuweisen
Loadouts, die im ACE-Arsenal (d.h. auch im Editor) erstellt wurden, können als Array exportiert werden. Dieses Array ist darauf ausgelegt, mit dem Scriptbefehl setUnitLoadout
verwemdet zu werden (siehe der Eintrag im Bohemia Wiki).
Bleiben wir beim obigen Beispiel. Erstellen wir zunächst ein Loadout im ACE-Arsenal und exportieren es durch drücken der Tastenkombination Strg
+C
. Dadurch erhalten wir folgenden Array:
[["arifle_Mk20C_plain_F","","acc_flashlight","optic_Aco_smg",["30Rnd_556x45_Stanag",30],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_Mag",17],[],""],["xru_u_coveralls_urbancamo",[]],["V_PlateCarrier1_blk",[["HandGrenade",2,1],["SmokeShell",2,1],["ACE_M84",4,1],["30Rnd_556x45_Stanag",8,30],["Chemlight_blue",2,1],["ACE_M14",2,1]]],[],"H_Watchcap_blk","G_Squares_Tinted",[],["ItemMap","","","ItemCompass","ItemWatch",""]]
Um das Loadout dann auf spawnende CSAT-Riflemen anwenden zu können, benötigen wir wiederum einen Class-EH in der init.sqf
. Diesmal nutzen wir keine Poppy-Funktion, sondern den bereits genannten Befehl setUnitLoadout.
ACHTUNG: Einer Einheit wird der Rucksack erst während der init zugewiesen. Wenn wir während dieser Phase das Loadout ändern, kann es passieren, dass der Rucksack auf dem Boden landet. Um das zu verhindern, muss das Loadout nach dem Abschluss der Initialisierung angewandt werden. Dazu benutzen wir schlicht statt des "init
“-Eventhandlers den "initPost"
-Eventhandler.
["O_Soldier_F", "initPost", {
_unit = (_this select 0);
if (local _unit) exitWith {
_unit setUnitLoadout [["arifle_Mk20C_plain_F","","acc_flashlight","optic_Aco_smg",["30Rnd_556x45_Stanag",30],[],""],[],["hgun_Rook40_F","","","",["16Rnd_9x21_Mag",17],[],""],["xru_u_coveralls_urbancamo",[]],["V_PlateCarrier1_blk",[["HandGrenade",2,1],["SmokeShell",2,1],["ACE_M84",4,1],["30Rnd_556x45_Stanag",8,30],["Chemlight_blue",2,1],["ACE_M14",2,1]]],[],"H_Watchcap_blk","G_Squares_Tinted",[],["ItemMap","","","ItemCompass","ItemWatch",""]]
};
}, false, [], true] call CBA_fnc_addClassEventHandler;
Das Ganze muss natürlich für jede KI-Klasse, deren Loadout verändert werden soll, wiederholt werden.