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.

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


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"];
};


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.
    };
};
Tags: