Des Operators neue Kleider
Zur Verteilung von Ausrüstung wird eine modifizierte, in das Template integrierte Version von Poppy verwendet. Poppy wurde ursprünglich von BlauBär entwickelt.
Poppy verteilt zum Missionsstart ein vorab definiertes Loadout an alle spielbaren Einheiten. Viele Ausrüstungsteile können hierbei zufällig aus einer Anzahl von Optionen ausgewählt werden, sodass kein “Einheitsbrei” entsteht, wenn dieser nicht gewollt ist.
CfgLoadouts
Die CfgLoadouts ist die zentrale Steuerungsdatei für Poppy-Loadouts. Sie ist im Stammverzeichnis der Mission platziert und wird in der description.ext referenziert.
Aufbau einer Loadout-Klasse
Loadout-Klassen werden wie ein klassischer Config-Eintrag aufgebaut.
Sämtliche Veränderungen müssen daher innerhalb der das Dokument umschließenden geschweiften Klammern, der class CfgLoadouts, stattfinden.
class CommonBlufor {
roledescription = "Default Loadout";
isplayerloadout = false;
//Clothing
uniform[] = {
"U_B_CTRG_1",
"U_B_CTRG_3",
{"USP_G3C_KP_MX_MCT",{{"USP_G3C_pantscamo","MCT"},{"USP_G3C_mxcamo","BLK"},{"USP_G3C_orcamo",""},{"USP_G3C_flagright","DEFAULT"},{"USP_G3C_flagleft","DEFAULT"}}}
};
backpack[] = {""};
vest[] = {"V_PlateCarrier2_blk"};
headgear[] = {"H_Cap_tan_specops_US", "H_Cap_oli_hs", "H_Booniehat_mcamo"};
goggles[] = {""};
//Weapons
primary[] = {
{
"arifle_SPAR_01_blk_F",
{"optic_Holosight_blk_F", "optic_Aco"},
"muzzle_snds_M",
"30Rnd_556x45_Stanag"
},
{"arifle_SPAR_01_snd_F", "optic_Holosight_blk_F", "muzzle_snds_M","150Rnd_556x45_Drum_Sand_Mag_F"}
};
secondary[] = {"hgun_ACPC2_F"};
launcher[] = {""};
binoculars[] = {""};
sling[] = {{"rhs_weap_m4a1", "", "rhsusf_acc_anpeq15_top", "rhsusf_acc_ACOG2", {"rhs_mag_30Rnd_556x45_M855A1_Stanag",30}, {}, "rhsusf_acc_tdstubby_tan"}};
//Mags + Items
magazines[] = {
"30Rnd_556x45_Stanag", 6,
"SmokeShellGreen"
};
items[] = {
"ACE_fieldDressing", 4,
"ACE_earplugs"
};
class filter {
30Rnd_556x45_Stanag[] = {"arifle_SPAR_01_blk_F"};
};
//misc
map[] = {"ItemMap"};
gps[] = {"ItemGps"};
nvgs[] = {""};
compass[] = {"ItemCompass"};
watch[] = {"ItemWatch"};
//Scripted
insignia[] = {"CTRG"};
slingHelmet[] = {"H_HelmetB_light", "H_HelmetB_light_black", "H_HelmetB_light_snakeskin"};
identity[] = {""};
preLoadout = "";
postLoadout = "";
};
Loadoutmenü
roledescription
STRING - Benennung des Eintrages im Loadoutmenü
isplayerloadout
BOOLEAN - Definiert, ob der Eintrag im Loadoutmenü angezeigt wird
Kleidung
uniform[]
ARRAY - Ein Array, aus dem zufällig eine der eingetragenen Uniformen ausgewählt wird
backpack[]
ARRAY - Ein Array, aus dem zufällig einer der eingetragenen Rucksäcke ausgewählt wird
vest[]
ARRAY - Ein Array, aus dem zufällig eine der eingetragenen Westen ausgewählt wird
headgear[]
ARRAY - Ein Array, aus dem zufällig eine der eingetragenen Kopfbedeckungen ausgewählt wird
goggles[]
ARRAY - Ein Array, aus dem zufällig eine der eingetragenen Brillen ausgewählt wird
Waffen
primary[]
ARRAY - Ein Array aus entweder einer Hauptwaffe und ihren Attachments (Var1), oder ein Array mit mehreren Arrays entsprechend Var1 (Var2)
// VARIANTE 1
primary[] = {
"arifle_SPAR_01_blk_F", //Waffe
{"optic_Holosight_blk_F", "optic_Aco"}, //Zufällige Auswahl aus 2 Visieren
"muzzle_snds_M",
"30Rnd_556x45_Stanag"
};
// VARIANTE 2
primary[] = {
{
"arifle_SPAR_01_blk_F", //Waffe
{"optic_Holosight_blk_F", "optic_Aco"}, //Zufällige Auswahl aus 2 Visieren
"muzzle_snds_M",
"30Rnd_556x45_Stanag"
},
{
"arifle_SPAR_01_snd_F",
"optic_Holosight_blk_F",
"muzzle_snds_M",
"150Rnd_556x45_Drum_Sand_Mag_F"
}
};
secondary[]
siehe primary[]
launcher[]
siehe primary[]
binoculars[]
siehe primary[]
sling[]
Fügt der Einheit eine über TSP Animate umgehängte Waffe hinzu. Wurde der Einheit kein Gewehrriemen über Poppy zugeteilt, wird dieser ebenfalls hinzugefügt.
Die Syntax muss zwinged der des Commands addWeaponWithAttachmentsCargoGlobal entsprechen!
[weapon, muzzle, flashlight, optics, [primaryMuzzle,ammocount], [secondaryMuzzle,ammocount], bipod]
Magazine / Items
magazines[]
ARRAY - Ein Array mit allen Gegenständen die vom Spiel als Magazin angesehen werden, insbesondere Magazine, Handgranaten, Sprengstoff.
Wird im Eintrag direkt nach einem Item eine Zahl angegeben, wird die Anzahl des Items auf die entsprechende Zahl erhöht.
items[]
ARRAY - Ein Array mit allen Gegenständen die vom Spiel als Item angesehen werden, insbesondere Bandagen, Medizinprodukte, Zünder, etc.
Wird im Eintrag direkt nach einem Item eine Zahl angegeben, wird die Anzahl des Items auf die entsprechende Zahl erhöht.
class filter {};
Die Subklasse filter wird verwendet, um Magazine und/oder Items nur in Verbindung mit speziellen Waffen auszugeben.
class filter {
30Rnd_556x45_Stanag[] = {"arifle_SPAR_01_blk_F"};
30Rnd_556x45_Stanag_Tracer_Red[] = {"arifle_SPAR_01_blk_F", "arifle_SPAR_01_snd_F"};
SmokeShellRed[] = {"arifle_SPAR_01_snd_F"};
};
Misc
map[]
ARRAY - Item für den Karten-Slot
gps[]
ARRAY - Item für den GPS-Slot
nvgs[]
ARRAY - Item für den Nachtsichtbrillen-Slot
compass[]
ARRAY - Item für den Kompass-Slot
watch[]
ARRAY - Item für den Uhren-Slot
Scripted
insignia[]
ARRAY - Fügt einen Schulterpatch bei den meisten Uniformen hinzu
slingHelmet[]
ARRAY - Ein Array, aus dem zufällig eine der eingetragenen Kopfbedeckungen ausgewählt und als SlingHelmet hinzugefügt wird
identity[]
ARRAY - Über diesen Wert wird der Einheit zwangsweise eine der angegebenen Identitäten zugewiesen. Das durch einen Spieler/eine Spielerin gewählt Gesicht wird hierdurch überschrieben
preLoadout
STRING - Code als String formatiert, welcher VOR der Loadoutvergabe ausgeführt wird
postLoadout
STRING - Code als String formatiert, welcher NACH der Loadoutvergabe ausgeführt wird
preLoadout und postLoadout kann verwendet werden, um über ACE3 Sonderrollen wie Medics, Explosive Specialists und Engineers zu definieren.
Dazu muss in der Loadoutklasse einer der folgenden Einträge erstellt werden:
Arzt:
preLoadout = “(_this select 0) setVariable [‘ACE_medical_medicClass’, 2, true];”;
Combat Medic:
preLoadout = “(_this select 0) setVariable [‘ACE_medical_medicClass’, 1, true];”;
Repair Specialist:
preLoadout = “(_this select 0) setVariable [‘ACE_isEngineer’, 2, true];”;
Combat Engineer:
preLoadout = “(_this select 0) setVariable [‘ACE_isEngineer’, 1, true];”;
Explosive Specialist:
preLoadout = “(_this select 0) setVariable [‘ACE_isEOD’, true, true];”;
Benennung der Loadoutklassen
CommonBlufor / CommonOpfor / CommonIndependent / CommonCivilian
Die Common-Klassen sind die Grundklassen einer Seite. Ist für eine Einheit der entsprechenden Seite kein dediziertes Loadout festgelegt, erhält sie immer die Common-Klasse.
Derzeitige Best-Practice ist es, die spezifischen Rollenklassen aus der Common-Klasse ihrer Seite erben zu lassen, welche bereits die grundlegende Ausrüstung enthält, die von allen Einheiten geteilt wird, wie z.b das IFAK, Bekleidung und bestimmte Führungs- und Einsatzmittel wie BFT und Funkgeräte.
Klassenloadouts
Für jede spielbare Klasse sollte je ein spezifisches Klassenloadout angelegt werden. Eine Einheit des Types B_Soldier_F erhält von Poppy immer automatisch das Loadout, welches in der Klasse class B_Soldier_F {}; definiert wurde.
Vererbung zwischen den Klassen
Um den Workflow und die Übersicht zu vereinfachen, kann in der Struktur der CfgLoadouts mit Vererbung gearbeitet werden.
Um eine andere Klasse als Grundlage zu verwenden, muss diese beim Eröffnen der neuen Klasse als “Parent” definiert werden. Die neue “Child”-Klasse erbt dadurch alle Einträge der vorherigen Klasse, einschließlich vorangegangener “Parent”-Klassen.
class CommonBlufor {
[...]
};
class B_Soldier_F: CommonBlufor {
[...] // Die Klasse "B_Soldier_F" ist nun ein "Child" von CommonBlufor, übernimmt also alle Werte die in CommonBlufor hinterlegt sind.
};
class B_Soldier_light_F: B_Soldier_F {
[...] // Die Klasse "B_Soldier_light_F" ist nun ein "Child" von B_Soldier_F, übernimmt also alle Werte die in B_Soldier_F (und damit auch die Werte aus CommonBlufor, sofern diese nicht gelöscht/überschrieben wurden) hinterlegt sind.
};
Diese geerbten Einträge können in der neuen Klasse zusätzlich überschrieben und erweitert werden.
class CommonBlufor {
ArrayA[] = {"A", "B"};
ArrayB[] = {"Z", "Y"};
};
class B_Soldier_F: CommonBlufor {
ArrayA[] += {"C", "D"}; // ArrayA = ["A", "B", "C", "D"];
ArrayB[] = {"X", "W"}; // ArrayB = ["X", "W"];
};
Beinhaltet der ursprüngliche Wert nested Arrays (mindestens ein Array innerhalb eines anderen Arrays), darf aufgrund eines Bugs in Arma keine Bearbeitung mehr über += erfolgen.
Auch Subklassen werden von der Parent-Klasse vererbt und können überschrieben/bearbeitet werden.
class CommonBlufor {
class SubClass {
ArrayC[] = {"A"};
};
};
class B_Soldier_F: CommonBlufor {
// class SubClass bleibt vorhanden, genau wie in CommonBlufor.
};
class B_Soldier_AR_F: CommonBlufor {
class SubClass: SubClass {
// ArrayD wird der bestehenden class SubClass hinzugefügt.
// Sie beinhaltet nun ArrayC und ArrayD.
ArrayD[] = {"B"};
};
};
class B_Soldier_SL_F: CommonBlufor {
class SubClass {
// class SubClass wird überschrieben.
// Sie beinhaltet nur noch ArrayE.
ArrayE[] = {"C"};
};
};
class B_Soldier_TL_F: CommonBlufor {
class SubClass {
// class SubClass wird überschrieben.
// Sie beinhaltet keine Werte mehr.
};
};