Vorwort

Diese Sammlung soll den Einstieg in die taktische ArmA 2 Spiel- und Editingszene zu erleichtern. Die Informationen sollen wenn möglich nicht redundant zu bestehenden Infos im Netz sein, weshalb häufig auf bestehende Internetadressen verwiesen wird. Die Rechte aller verwendeten Markennamen liegen beim jeweiligen Besitzer und dienen im Kontext dieser Website ausschließlich der eindeutigen Kennzeichnung. Ich bedanke mich bei MemphisBelle und MorgenEule für den leichten Einstieg in die Arma 2 Mission Editing Szene via Teamspeak. Auch bedanke ich mich bei all jenen, die ihr Wissen im Internet frei zugänglich zur Verfügung gestellt haben und es der Community somit ermöglichen, neuen Content für ArmA 2 zu erstellen. Deren guten Beispiel folgend, will auch ich der Community etwas zugute kommen lassen. Also here we go :-)

Schnell zum richtigen Kapitel: 1. Installation - 2. Integrierter Missionseditor - 3. Mission Editing Ordnerstruktur - 4. Mission Editing Dateispezifika - 5. Mission Scripting - 6. Für das Mappen erforderliche Software - 7. ArmA 2 interner 3D Missionseditor - 9. Deine Anmerkungen via Shoutbox

1. Installation

1.1 ArmA 2 und ArmA 2: Operation Arrowhead

Ich empfehle den Kauf von ArmA 2 und ArmA 2: Operation Arrowhead über steam. Für eine schnelle und umkomplizierte Bezahlung eignet sich der Webservice Paypal.
ArmA2 kaufen bei
steam
Bei steam bezahlen via
PayPal

1.2 Steam-Version mit Retail-Version kompatibel machen

Bei manchen Clans ist es erforderlich eine Retail-Version von Combined Operations zu besitzen. Combined Operations ist nichts anderes als die Summe aus dem Hauptspiel ArmA 2 zzgl. Standalone Erweitertung ArmA 2 OA. Combined Operations und Hauptspiel+Erweiterung unterscheiden sich lediglich in der Ordnerstruktur. Kein Grund zu verzweifeln. Wenn ihr den AddOns-Ordner aus ArmA 2 in das Hauptverzeichnis von ArmA 2 OA kopiert, habt ihr quasi plötzlich ein vollwertiges ArmA 2 Combined Operations. Man kopiert also diesen AddOns Ordner (nicht nur den Inhalt sondern den ganzen Ordner AddOns):
C:\Program Files (x86)\Steam\SteamApps\common\Arma 2\AddOns
Und fügt den Ordner so ein, dass dieser Ordner entsteht:
C:\Program Files (x86)\Steam\SteamApps\common\Arma 2 Operation Arrowhead\AddOns

1.3 Mods/AddOns für Arma2

Für die Teilnahme an taktischen ArmA 2 Events, benötigt ihr die Mods ACE und ACRE. Für Informationen rund um das Advanced Combat Environment ACE und das Advanced Combat Radio Environment ACRE verweise ich auf die äußerst gelungenen Videos von JeremiahRose.
ArmA 2 ACE – Features (2013, german) ArmA 2 ACRE-Tutorial (german)
Wenn von ACE und ACRE die Rede ist, sind meisten im Einzelnen folgende Mods gemeint, die ihr euch einzeln wie oben gezeigt herunterladen könnt:
@ace, @acex, @acex_pla, @acex_ru, @acex_sm, @acex_usnavy, @acre
In der Regel werden darüberhinaus die Mods @cba_co und @jayarma2lib benötigt um auf einen ACE/ACRE Server zu connecten.
@cba_co, @jayarma2lib
Und auch der Bundeswehr Mod kommt häufig zum Einsatz. Daher ist es empfehlenswert folgende Addons zu installieren:
@bwmod, @bwmod_ace, @bw-compilation, @bw-compilation_ace, @amt, @gaf, @gaf_ace, @gaf_acre, @rksl
Während die bisher genannten Mods benötigt werden um auf Server zu connecten, bei welchen diese Mods im Rahmen des Missionsbaus verwendet wurden, gibt es darüberhinaus Client-seitige Mods. Diese Mods sind Server unabhängig und erweitern die Spielerfahrung. Für realistischere Sounds installiert man beispielsweise optional die Mods @jsrs und @jsrs_ace.

Für ein taktisches Radar, auf welchem man die Positionen der umliegenden Mitspieler erkennt, nutzt man @sthud. Für flüssigere Bewegungen durch Gebäude ist @stmovement hilfreich. Für erweiterte Explosionseffekte kommt oftmals @WarFX_Particles_Beta_1.41 und @blastcore_visuals zum Einsatz. Will man Fahrzeugrückspiegelansichten nutzen, benötigt man das Addon Blakes Mirrors.

Wenn man ArmA2 über Startparameter anpassen will anstatt einen Launcher zu verwenden, könnten die Startparameter inkl. sog. Modstring z. B. so aussehen:

"C:\Program Files (x86)\Steam\steamapps\common\Arma 2 Operation Arrowhead\ArmA2OA.exe" -skipintro -nosplash
-showScriptErrors -mod=Expansion;@CBA_CO;@Jayarma2lib;@ACE;@ACEX;@ACEX_SM;@ACEX_RU;@ACEX_USNavy;@ACRE;@mcc_sandbox
Problematisch ist bei dieser Art der Anpassung einer Verknüpfung auf dem Desktop, dass Battleeye meist nicht automatisch mitgestartet wird. Stattdessen möglich und empfehlenswert ist es, die Startparameter in steam zu setzen und das Spiel dann auch über Steam zu setzen. In Steam Rechtsklick aufs Spiel > Eigenschaften > Startoptionen und dort dann diese Startparameter eingeben:
-skipintro -nosplash
-showScriptErrors -mod=Expansion;@CBA_CO;@Jayarma2lib;@ACE;@ACEX;@ACEX_SM;@ACEX_RU;@ACEX_USNavy;@ACRE;@mcc_sandbox
Blakes Mirrors
Rückspiegel für Fahrzeuge
@jsrs
Sound-Mod
Taktische Benutzeroberfläche
@sthud
Flüssige Bewegung durch Häuser mittels
@stmovement

1.5 Interessante zusätzliche Inseln/Maps

In der taktischen ArmA 2 Szene sind einige besonders gelungene Maps (wobei jede Map - egal ob Insel oder nicht - Insel genannt wird) stark verbreitet. Dazu gehören unter anderem die folgenden:
Taviana Celle Namalsk Lingor
Dingor Fallujah Esbekistan Sangin
Isla Duala Thirsk Clafghan Schwemlitz
Sahrani Everon

1.6 Teamspeak

Um ACRE nutzen zu können, benötigt man Teamspeak. Es sei angemerkt, dass die aktuelle Teamspeak Version meist nicht mit ACRE kompatibel ist. Kompatibel ist z. B. die Version 3.0.12. Wenn ihr also die 3.0.12er installiert, passt auf, dass ihr nicht versehentlich die Software aktualisiert. Ihr werdet ständig gebeten, ein Update durchzuführen. Erfahrungsgemäß kommt es zu Problemen, wenn man Teamspeak nicht als Adminstator ausführt. Also führt es bitte als Administator aus.

1.7 Taktisches Know How

Bevor Ihr euch das erste Mal für ein ArmA 2 Event anmeldet, solltet ihr neben den besagten ACE/ACRE Tutorials, auch mal einen Blick auf eine typische Vorbesprechung derartiger Großevents werfen. Durch das Video lernt ihr beispielsweise, dass es Sinn macht, sich zu Beginn eines Events mit Block und Stift zu bewaffnen, da man sich sonst die Funkstruktur nicht merken kann. Genauso werdet ihr feststellen, dass man während des Events in der Regel nicht mal kurz AFK gehen kann. Also vorher was zu trinken an den Tisch stellen ;-)
Mitschnitt einer
typischen Missionsvorbesprechung
Typische Hierarchie
bei taktischen ArmA2 Events
So viel zum allgemeinen Teil. Als nächstes folgt ein Kapitel über das Mission Editing in ArmA 2.

2. Integrierter Missions-Editor

2.1 Integrierter Missions-Editor

Wenn ihr Multiplayer Missionen erstellen wollt, nutzt bitte den Editor, den ihr im Multiplayerbereich von ArmA 2 findet, unter Multiplayer > New> Create > New Editor. Wenn ihr dort eine Mission erstellt und diese speichert, so wird unter Windows 7 seitens ArmA 2 automatisch ein entsprechend benannter Ordner in folgendem Verzeichnis anlegt:
C:\Users\master\Documents\ArmA 2 Other Profiles\smallfly\MPMissions
Wenn ihr Singleplayer-Missionen erstellt, werden diese hier gespeichert:
C:\Users\master\Documents\ArmA 2 Other Profiles\smallfly\missions
Wenn ihr an ArmA 2 Events teilgenommen habt, also auf fremden Servern connected habt, so findet ihr die entsprechenden Missionsdateien in folgendem Ordner:
C:\Users\master\AppData\Local\ArmA 2 OA\MPMissionsCache
Zwecks allgemeiner Einarbeitung in den Missions-Editor verweise ich auf die 9-teilige Tutorial-Video-Serie von MulleDK19. Noch ein Hinweis: Wenn ihr das Zeichen Æ (A und E in einem Buchstaben verschmolzen) lest. Das steht für ACE.
Tutorial-Serie von
MulleDK19
AMS Editor Tutorial 2.0 Mr-Murrays ArmA Editing Guide Deluxe Edition

2.2 Wichtige Module und deren Bedeutung

Nachfolgende Module sollten auf jeder für ACE/ACRE gedachten ArmA 2 Mission zu finden sein. Die Module können im Missionseditor platziert werden.

Die Konfiguration lässt sich direkt in deren Initialization-Zeilen vornehmen. Ich empfehle aber die Nutzung der init.sqf. Die init.sqf dieses Handbuchs enthält bereits die wesentlichen Konfigurationsvariablen, passend zu den nachfolgend aufgelisteten Modulen.
Æ Enable AI grass viewblock KI kann nicht durch Grass sehen. Dadurch entstehen gleiche Bedingungen für Spieler und KI.
Æ Enable ammo cookoff Mit Munition beladene Fahrzeuge/Waffenkisten explodieren entsprechend heftig.
Æ Enable spare tyres in vehicles Ersatzreifen sind an Bord jedes Fahrzeuges. So hat man bei einem platten Reifen die Möglichkeit des Reifenwechsels.
Æ Force group markers off Es gibt keine Markierungen auf der Map, wo die eigenen Einheiten gerade stehen.
Æ Respawn with same weapons/mags Vor dem Tod ist nach dem Tod.
Æ Wounds: Enable wounding system Das komplexe ACE Verwundungssystem (Ohnmacht statt Tod) wird aktiviert. Die drei Extra-Slots für Bandagen, Morphium und Medpacks werden im Inventar sichtbar.
Æ Wounds: Full heal in the field Es bleibt nach der ersten Hilfe kein Restschaden. Volle Heilung im Feld möglich.
Æ Enable AI Talk AI Gegner sprechen miteinander.
Æ Require ACE Nur mit ACE last sich überhaupt auf den Server connecten.
Require CBA Nur mit CBA, also den Community Based Addons, lässt sich überhaupt auf den Server connecten.
Blakes Mirror Fahrzeugrückspiegel
Garbage Collector Leichen schneller aufräumen
Jede Einheit muss dafür wie folgt dem Garbage Collector bekannt gemacht werden:
a = [unit] execVM "ca\modules\garbage_collector\data\scripts\trashIt.sqf"
Functions Allgemeine Funktionen werden für das Skripten zur Verfügung gestellt. Dieses Modul findet man i. d. R. in jeder Mission.
ACE Map Logic Damit die ACE_Map wirklich nur eigene Marker anzeigt, braucht man eine platzierte ACE Map Logic.
Anstatt die Module auf der Map zu platzieren kann man alternativ durch Setzen bestimmter Variablenwerte in der init.sqf dasselbe erreichen:
ace_sys_wounds_leftdam = 0; // entspricht 'Æ Wounds: Full heal in the field'
// oder man nimmt einen Wert größer 0 um Schaden übrig zu lassen und somit 
// zu erzwingen, dass eine Einheit zurück zur Basis (Mediczelt) zur Endheilung gebracht werden muss

3. Mission Editing Ordnerstruktur

Im Folgenden gehe ich ausschließlich auf das Multiplayer Mission Editing ein, weshalb ich mich nun nur noch auf diesen Ordner beziehe:
C:\Users\master\Documents\ArmA 2 Other Profiles\smallfly\MPMissions
Wenn ihr im Missionseditor die Karte Takistan wählt und die Mission anschließend z. B. unter dem Namen Silent Hills speichert, so wird folgender Ordner automatisch erstellt:
C:\Users\master\Documents\ArmA 2 Other Profiles\smallfly\MPMissions\Silent%20Hills.Takistan

3.1 mission.sqm

In diesem Ordner findet ihr einzig die Datei mission.sqm. Diese lässt sich bequem mit Notepad++ öffnen und editieren. Das muss man jedoch nur selten, zumal der Inhalt bequem über den grafischen Missionseditor im Spiel gesteuert werden kann. Platziert man z. B. eine Einheit, so findet man in der mission.sqm die entsprechenden Zeilen wieder. In diesem Kontext sei auf Mr-Murray verwiesen, der ab Seite 42 die Ordner- und Dateistruktur erläutert.
Notepad++

3.2 init.sqf

Alle weiteren Dateien, wie z. B. die init.sqf müssen manuell erstellt werden. Öffne dazu Notepad++ und speicher die Datei als init.sqf ab. Aufpassen, dass man die Datei nicht als init.sqf.txt speichert! Typischerweise sieht eine init.sqf bei Verwendung von ACE, ACRE und DAC folgendermaßen aus:
// Vorlagen, Skriptschnipsel, Programmierhilfen laden
execVM "scripts\templates.sqf";

// Vorkompilieren aller häufig (mehr als einmal) auszuführenden Skripte
// _content=preprocessFileLineNumbers "myOftenCalledScript.sqf"

// Dynamic AI Creator initialisieren
execVM "scripts\initDAC.sqf";

// Allgemeine Einstellungen vornehmen
execVM "scripts\initGeneralSettings.sqf"; // Die allgemeinen Einstellungen extern definieren ...

// ... oder sofort hier in der init.sqf wie folgt:
setViewDistance 2000; // Sichtweite
setTerrainGrid = 25; // weniger Grass (50 für kein Grass, 3.125 für sehr viel Grass)
enableTeamswitch = false;
ace_wounds_prevtime = 900; // Zeit in Sekunden nach tödlicher Verwundung bis Respawn; 600 Sekunden = 10 Minuten

// Ost und West verfeinden, falls keine Einheiten manuell im Editor platziert wurden
execVM "scripts\defineSides.sqf";

// Squad Info Menü seitens Spieler aufrufbar machen
execVM "scripts\createSquadInfoMenu.sqf";

// Waffen zuordnen
execVM "scripts\equipPlayers.sqf";

// Briefing erzeugen
execVM "scripts\createBriefing.sqf";

// Wird einmal direkt nach der init.sqf ausgeführt, und dann immer, wenn ein Spieler connectet
if (isServer) then { onPlayerConnected "[_id, _name] execVM ""scripts\onPlayerConnected.sqf"""; }

3.3 scripts\templates.sqf

Skriptvorlagen kann man sich (natürlich auskommentiert) in einer templates.sqf speichern. Dabei handelt es sich um einen frei wählbaren Namen.
/*
//this addEventHandler ["Fired", {hint format ["%1", _this]}];
//hint format ["%1",east countSide list Area1];
//this setVariable ["ace_w_ismedic",true]

//Lokalitäten:
// - player ist lokal auf dem jeweiligen Rechner
// - AI ist lokal auf dem Server
// - Empty vehicles sind lokal auf dem Server
// - Fahrende Fahrzeuge sind lokal auf dem PC des Fahrers
// - lock, hint, say, sideChat, globalChat, groupChat sind lokal auf dem ausführenden Rechner
// - setDammage, setFuel sind global, müssen aber auf dem Rechner ausgeführt werden, auf dem das Fahrzeug lokal ist
// - Triggers sind lokal, also als unabhängige Kopien auf allen Rechnern
// - EventHandlers funktionieren lokal, werden also nur gestartet von einem lokalen Objekt
*/

3.4 scripts\createBriefing.sqf

Die briefing.sqf ist eine Skript-Datei. Demnach könnte man auch darauf verzichten, indem man den Inhalt direct in die init.sqf schreibt. Der besseren Übersichtlichkeit halber, empfehle ich dennoch eine briefing.sqf in jeden eurer Missionsordner zu integrieren. Eine typische briefing.sqf sieht wie folgt aus. Man beachte die vermeintlich falsche Reihenfolge der Aufträge. Man beginnt nämlich mit dem letzten Auftrag.
//player createDiaryRecord ["Diary", ["Bla bla bla", "Bla bla bla"]];
//player createDiaryRecord ["Diary", ["Bla bla bla", "Bla bla bla"]];

// first task
task0 = player createSimpleTask ["taskName0"];
task0 setSimpleTaskDescription ["Schalten Sie alle feindlichen Kräfte in Shukurkalay aus.","Shukurkalay säubern",""];
task0 setTaskState "Assigned";

player setCurrentTask task0;

3.5 scripts\defineSides.sqf

Das manuelle Verfeinden ist nur dann nötig, wenn keine einzige Einheit einer bestimmten Seite mittels Mission Editor manuell platziert wurde. Wer den Mission Editor verwendet, um mindestens eine Einheit jeder relevanten Seiten zu platzieren, kann auf nachfolgende Datei verzichten.
Createcenter EAST; // eigentlich nur noetig, wenn im Editor keine einzige East Einheit manuell gesetzt wird
Createcenter WEST; // eigentlich nur noetig, wenn im Editor keine einzige West Einheit manuell gesetzt wird
WEST setFriend [EAST,0]; // West und East verfeinden
EAST setFriend [WEST,0]; // East und West verfeinden

3.6 scripts\equipPlayers.sqf

Angenommen man hat einer Einheit den Namen a1 gegeben und will diese nun ausrüsten. Wir könnten den nachfolgenden Code direkt in die init.sqf schreiben, da diese dann aber etwas unübersichtlich wird, lagern wir den Ausrüstungscode lieber in eine externe Datei namens scripts\equipPlayers.sqf aus.
removeAllWeapons a1;
removeAllItems a1;
removeBackpack a1;

_riflemanWeapons = [
	"M4A3_CCO_EP1",
	"M9SD"
];

_standardItems = [
	"Binocular",
	"ItemCompass",
	(...)
];

_riflemanAmmo = [
	"30Rnd_556x45_Stanag",
	"30Rnd_556x45_Stanag",
	"30Rnd_556x45_Stanag",
	(...)
	"15Rnd_9x19_M9SD",
	"15Rnd_9x19_M9SD",
	"ACE_Bandage",
	"ACE_LargeBandage"
];

{a1 addMagazine _x} foreach _riflemanAmmo;
{a1 addWeapon _x} foreach _riflemanWeapons;
{a1 addWeapon _x} foreach _standardItems;

a1 selectWeapon (primaryWeapon a1);
Alternativ könnte man ein Objekt auf die Karte stellen und z. B. als waffenKiste benennen. Anschließed müsste man in der init.sqf diese Zeilen hinzufügen:
Private ["_action"];

clearWeaponCargo waffenKiste;

_action = waffenKiste addAction ["Ausrüstung Sturmsoldat", "spielerAusruesten.sqf", "sturmsoldat"];
_action = waffenKiste addAction ["Ausrüstung Grenadier", "spielerAusruesten.sqf", "grenadier"];
_action = waffenKiste addAction ["Ausrüstung MG-Schütze", "spielerAusruesten.sqf", "mgSchuetze"];
_action = waffenKiste addAction ["Ausrüstung Luftabwehr", "spielerAusruesten.sqf", "luftAbwehr"];
_action = waffenKiste addAction ["Ausrüstung Panzerabwehr", "spielerAusruesten.sqf", "panzerAbwehr"];
_action = waffenKiste addAction ["Ausrüstung Gruppenscharfschütze", "spielerAusruesten.sqf", "gruppenscharfschuetze"];
_action = waffenKiste addAction ["Ausrüstung Scharfschütze", "spielerAusruesten.sqf", "scharfschuetze"];
_action = waffenKiste addAction ["Ausrüstung Spotter", "spielerAusruesten.sqf", "spotter"];
Die darin verlinkte spielerAusruesten.sqf schaut dann in Auszügen so aus.
Private [
	"_anbieter", "_aufrufer", "_actionId",
	"_ausruestungTyp", "_typLesbar",
	"_ammo", "_stdAmmo", "_weapons", "_stdWeapons",
	"_items", "_stdItems", "_backpackItems", "_stdBackpackItems",
	"_acePackSuccess"
];

_anbieter = _this select 0; // Das Objekt, welches die Aktion anbietet wird ArmA seitig immer an Position 0 gespeichert
_aufrufer = _this select 1; // Der aufrufende Spieler, also man selbst, wird ArmA seitig immer an Position 1 gespeichert
_actionId = _this select 2; // Die ganze Aktion bekommt einen Identifier; immer gespeichert an Position 2

_ausruestungTyp = _this select 3;

[_aufrufer, "ALL"] call ACE_fnc_RemoveGear;
removeAllWeapons _aufrufer;
removeAllItems _aufrufer;
removeBackpack _aufrufer;

_acePackSuccess = [_aufrufer, 1, 1, 0] call ACE_fnc_PackIFAK;

_typLesbar = "";

switch (_ausruestungTyp) do
{
	case "gruppenscharfschuetze" :
	{
		_typLesbar = "Gruppenscharfschütze";
		
		_items = [
		];
		
		_backpackItems = [
		];
		
		_weapons = [
			"ACE_BackPack_ACR_FL",
			"bw_g3_dmr"
		];

		_ammo = [
			"ACE_20Rnd_762x51_B_G3",
			"ACE_20Rnd_762x51_B_G3",
			"ACE_20Rnd_762x51_B_G3",
			"ACE_20Rnd_762x51_B_G3"
		];
	};
	
	(...)

	case "grenadier" :
	{
		_typLesbar = "Grenadier";
		
		_items = [
		];
		
		_backpackItems = [
		];
		
		_weapons = [
			"ACE_BackPack_ACR_FL",
			"ACE_G36A2_AG36A2"
		];

		_ammo = [
			"30Rnd_556x45_G36",
			"30Rnd_556x45_G36",
			"30Rnd_556x45_G36",
			"30Rnd_556x45_G36",
			"30Rnd_556x45_G36",
			"30Rnd_556x45_G36",
			"1Rnd_HE_M203",
			"1Rnd_HE_M203",
			"1Rnd_HE_M203",
			"1Rnd_HE_M203"
		];
	};

	default {
		_typLesbar = "Ungültig";
	};
};

_stdWeapons = [
	"ACE_USPSD"
];

_stdAmmo = [
	"HandGrenade_West",
	"HandGrenade_West",
	"ACE_12Rnd_45ACP_USPSD",
	"ACE_12Rnd_45ACP_USPSD",
	"ACE_12Rnd_45ACP_USPSD",
	"ACE_12Rnd_45ACP_USPSD"
];

_stdItems = [
	"ItemCompass",
	"ItemGPS",
	"ACE_Map",
	"ACE_Map_Tools"
];

_stdBackpackItems = [
	"SmokeShell",
	"SmokeShellRed",
	"SmokeShellGreen",
	"ACE_Medkit",
	"ACE_Morphine"
];

{_aufrufer addWeapon _x} forEach _weapons;
{_aufrufer addWeapon _x} forEach _stdWeapons;

{_aufrufer addMagazine _x} forEach _ammo;
{_aufrufer addMagazine _x} forEach _stdAmmo;

{_aufrufer addWeapon _x} forEach _items;
{_aufrufer addWeapon _x} forEach _stdItems;

{_acePackSuccess = [_aufrufer, _x, 1] call ACE_fnc_PackMagazine;} forEach _backpackItems;
{_acePackSuccess = [_aufrufer, _x, 1] call ACE_fnc_PackMagazine;} forEach _stdBackpackItems;

_aufrufer selectWeapon (primaryWeapon _aufrufer);

systemChat format ["Standardausrüstung '%1' zugewiesen!", _typLesbar];
Das vollständige Skript findet ihr in der beiliegenden Beispielmission.
Beispielmission
Außerdem könnte man ein paar Kisten benennen mit den Namen itemsKiste, explosivstoffKiste, medicKiste und waffenKiste. Diese Kisten könnte man dann in der init.sqf wie folgt mit Items/Waffen/Magazinen befüllen.
clearWeaponCargo itemsKiste;
clearMagazineCargo itemsKiste;

itemsKiste addWeaponCargo ["NVGoggles",50]; // Nachtsicht
itemsKiste addWeaponCargo ["ACE_MX2A",50]; // Wärmebildfernglas
itemsKiste addWeaponCargo ["Binocular_Vector",20]; // Vector Entfernungsmessgerät und Fernglas
itemsKiste addWeaponCargo ["ItemGPS",20]; // GPS Geräte
itemsKiste addWeaponCargo ["ACE_DAGR",20]; // Zielkoordinaten/Höhe von mit Vector/SOFLAM anvisiertem Ziel
itemsKiste addWeaponCargo ["ACE_Earplugs",20]; // Ohrstöpsel
itemsKiste addWeaponCargo ["ACE_GlassesBalaklava",20]; // Sturmhaube
itemsKiste addWeaponCargo ["ACE_GlassesBalaklavaGray",20]; // Sturmhaube
itemsKiste addWeaponCargo ["ACE_GlassesBalaklavaOlive",20]; // Sturmhaube
itemsKiste addWeaponCargo ["ACE_GlassesTactical",20]; // Taktische Brille
itemsKiste addWeaponCargo ["ACE_HuntIR_monitor",20]; // Monitor für Unterlaufkamera
itemsKiste addWeaponCargo ["ACE_Kestrel4500",20]; // Windmessgerät
itemsKiste addWeaponCargo ["ACE_Map",20]; // Karte
itemsKiste addWeaponCargo ["Laserdesignator",20]; // SOFLAM um Ziele für Jet-Raketen anvisieren
itemsKiste addWeaponCargo ["ACE_SpareBarrel",20]; // Tasche für zusätzlichen Lauf beim MG
itemsKiste addWeaponCargo ["ACE_SpottingScope",20]; // Spotting Scope
itemsKiste addWeaponCargo ["ACE_Map_Tools",20]; // ACE Map Tools zum Zeichnen und Messen auf Karten
itemsKiste addWeaponCargo ["ACE_GlassesGasMask_RU",20]; // Gasmaske (nur im TvT sinnvoll)
itemsKiste addWeaponCargo ["ACE_GlassesGasMask_US",20]; // Gasmaske, US Version

itemsKiste addWeaponCargo ["ACRE_PRC343",20]; // Kleines Funkgerät 343er
itemsKiste addWeaponCargo ["ACRE_PRC148_UHF",20]; // Mittleres Funkgerät 148er
itemsKiste addWeaponCargo ["ACRE_PRC119",20]; // Großes Funkgerät
itemsKiste addWeaponCargo ["ACRE_PRC117F",20]; // Großes Funkgerät

itemsKiste addMagazineCargo ["ACE_Battery_Rangefinder",20]; // Batterien für Vector Entfernungsmessgerät
itemsKiste addMagazineCargo ["Laserbatteries",20]; // Batterien fürs SOFLAM

itemsKiste addWeaponCargo ["ACE_CharliePack", 50]; // Wüstenstyle
itemsKiste addWeaponCargo ["ACE_CharliePack_ACU_Medic", 50]; // Medic Version
itemsKiste addWeaponCargo ["ACE_CharliePack_Multicam", 50]; // Multi-Camo Style
itemsKiste addWeaponCargo ["ACE_CharliePack_WMARPAT", 50]; // Wald Camo
Zusätzlich zur Kiste für Gegenstände kommt die Kiste für Explosivstoffe:
clearWeaponCargo explosivstoffKiste;
clearMagazineCargo explosivstoffKiste;

explosivstoffKiste addMagazineCargo ["HandGrenade_West",10]; // Handgranate
explosivstoffKiste addMagazineCargo ["PipeBomb",10];
	// Sprengung per Timer (2/5 Min) oder ferngezündet gegen Gebäude/Fahrzeuges
explosivstoffKiste addMagazineCargo ["ACE_C4_M",10]; // Türen aufsprengen, ferngezündet oder Timer
explosivstoffKiste addMagazineCargo ["ACE_DM12B1_M",200]; // Selbstauslösende Panzermine
explosivstoffKiste addMagazineCargo ["SmokeShell",20]; // Weiße Rauchgranate
explosivstoffKiste addMagazineCargo ["SmokeShellRed",20]; // Rote Rauchgranate um Feinde zu markieren
explosivstoffKiste addMagazineCargo ["SmokeShellGreen",20]; // Grüne Rauchgranate um eigene Leute zu markieren
explosivstoffKiste addMagazineCargo ["ACE_CLAYMORE_M",50];
	// Selbstauslösende (Stolperdraht) oder ferngezündete Antipersonenmine
Eine typische Waffenkiste samt Munition für US Army Missionen könnte so aussehen:
clearweaponcargo waffenKiste;
clearMagazineCargo waffenKiste;

// MG-Schütze
waffenKiste addWeaponCargo ["ACE_M249_AIM",5];
waffenKiste addWeaponCargo ["ACE_M249_PIP_ACOG",5];
waffenKiste addWeaponCargo ["M240",5];

waffenKiste addWeaponCargo ["ACE_M110",5];
waffenKiste addWeaponCargo ["M110_NVG_EP1",5];
waffenKiste addWeaponCargo ["M110_TWS_EP1",5];
waffenKiste addMagazineCargo ["ACE_20Rnd_762x51_T_SCAR", 100]; // für M110
waffenKiste addMagazineCargo ["ACE_20Rnd_762x51_SB_SCAR", 100]; // für M110

waffenKiste addWeaponCargo ["M16A4_ACG_GL",5];
waffenKiste addWeaponCargo ["m16a4",5];
waffenKiste addWeaponCargo ["M16A4_GL",5];
waffenKiste addWeaponCargo ["ACE_M4_Eotech",15];
waffenKiste addWeaponCargo ["ACE_M4_ACOG",15];
waffenKiste addWeaponCargo ["ACE_M4_ACOG_PVS14",15];
waffenKiste addWeaponCargo ["ACE_M4_Aim",15];
waffenKiste addWeaponCargo ["ACE_M4_AIM_GL",15];
waffenKiste addWeaponCargo ["ACE_M4_RCO_GL",15];
waffenKiste addWeaponCargo ["ACE_M4_Eotech_GL",15];
waffenKiste addMagazineCargo ["30Rnd_556x45_Stanag",1000]; // Normales Stanagmagazin
waffenKiste addMagazineCargo ["ACE_30Rnd_556x45_S_Stanag",1000]; // Silenced
waffenKiste addMagazineCargo ["ACE_30Rnd_556x45_T_Stanag",1000]; // Tracer

waffenKiste addWeaponCargo ["ACE_M32",5];
waffenKiste addMagazineCargo ["1Rnd_HE_M203",50];
waffenKiste addMagazineCargo ["6Rnd_HE_M203",20];

waffenKiste addWeaponCargo ["ACE_SOC_M4A1_Eotech_4x",15];
waffenKiste addMagazineCargo ["ACE_200Rnd_556x45_T_M249",100];
waffenKiste addMagazineCargo ["ACE_100Rnd_556x45_T_M249",100];
waffenKiste addMagazineCargo ["100Rnd_762x51_M240",100];
Und natürlich eine Kiste mit medizinischer Ausrüstung:
clearWeaponCargo medicKiste;
ClearMagazineCargo medicKiste;

medicKiste addMagazineCargo ["ACE_Bandage",200];
medicKiste addMagazineCargo ["Ace_Epinephrine",150];
medicKiste addMagazineCargo ["Ace_LargeBandage",200];
medicKiste addMagazineCargo ["Ace_Medkit",100];
medicKiste addMagazineCargo ["Ace_Morphine",200];
ArmA 2 ACE Klassennamen aller Waffen, Gegenstände und Magazine Klassennamen der Waffen des Bundeswehr Mod

3.7 scripts\onPlayerConnected.sqf

Die meisten Informationen werden automatisch ausgetauscht. Einige Infos müssen jedoch im Falle nachjoinender Spieler manuell ausgetauscht werden. Die onPlayerConnected.sqf wird nur serverseitig ausgeführt (vgl. weiter oben if (isServer) then { ...).
// marker positions via setMarkerPos and marker properties
// ...

// skipTime, setDate, setOvercast, setFog if the commands have been used in your scripts
// ...

// publicVariable myVariable for all variables you wish to be known by every player
// ...

3.8 scripts\initDAC.sqf

//DAC Initialisierung
//if(!isServer) then {waitUntil{!isNull player}};
//DAC_Zone = compile preprocessFile "DAC\Scripts\DAC_Init_Zone.sqf";
//DAC_Objects	= compile preprocessFile "DAC\Scripts\DAC_Create_Objects.sqf";
//execVM "DAC\DAC_Config_Creator.sqf";

3.9 stringtable.xml

Gelegentlich stößt man in Missionsordnern auf eine stringtable.xml. Diese könnte wie folgt aussehen. Mit Hilfe einer solchen Datei, lässt sich sprachlich barrierefrei skripten. Soll heißen, man verweist in einer Mission auf eine Variable STR_BLA_1 und sagt ArmA 2, dass man den Inhalt der Variablen bitte auf Englisch haben möchte. Natürlich muss man die gewünschte Sprache nicht angeben. Das entscheidet der Spieler. In unserer obigen briefing.sqf müssten wir dafür die Klartexte jeweils durch eine Variable ersetzen. Wir würden aus „Bla bla bla“ beispielsweise [localize „STR_BLA_1“] machen.
< ?xml version="1.0" encoding="utf-8"?>
< Project name="Silent_Hills">
< Package name="smallflys Missions">
< Container name="mission texts">

// Zeilenumbruch durch Schreiben von <br/>
// Verweis auf Marker durch <marker name="#">#</marker>

// OPZ Funksprueche
< Key ID="STR_OPZ_1">
< English>OPZ an alle Einheiten. Ausruesten und zu Sammelpunkt Sierra 1 bewegen.< /English>
< German>OPZ an alle Einheiten. Ausruesten und zu Sammelpunkt Sierra 1 bewegen.< /German>
< /Key>

// Sonstige Strings
< Key ID="STR_BLA_2">
< English>Blah blah blah< /English>
< German>Bla bla bla< /German>
< /Key>

< /Container>
< /Package>
< /Project>

3.10 description.ext

Jeder Missionsordner sollte zudem über eine Datei namens description.ext verfügen. Hier werden allgemeine Missionseinstellungen vorgenommen.
onLoadMission = "Silent Hills - Takistan COOP Mission";
onLoadIntro = "Mission scripted by smallfly";  
onLoadIntroTime = TRUE;
onLoadMissionTime = TRUE;
loadScreen = "arma_coop_smallfly.paa"; // Bild, das während dem Missionsladen angezeigt wird
Saving = 0;

class Header
{
	gameType = COOP;
	minPlayers = 1;
	maxPlayers = 6;
};

showCompass = 1;
showMap = 1;
showGPS = 1;
showWatch = 1;
showDebriefing = 0;

respawn = "BASE"; // Einheiten respawnen am Marker "respawn_west"
respawnDelay = 5; // Zeit in Sekunden nach dem Verlust der Einheit bis zum Respawn
respawnVehicle = "BASE"; // Fahrzeuge respawnen am Marker "respawn_vehicle_west"
respawnVehicleDelay = 5; // Zeit in Sekunden nach dem Verlust des Fahrzeugs bis zum Respawn
disabledAI = 1; // Computer übernimmt keine Steuerung für Menschen gedachter Slots in der Lobby
AIkills = 1; // Enables scorelist for AI players 
respawnDialog = true; // Fragedialog im Spiel, ob man wirklich sicher ist, dass man respawnen will

class CfgSounds
{
	sounds[] = {};
	class STR_OPZ_1
	{
		// how the sound is referred to in the editor (e.g. trigger effects)
		name = "STR_OPZ_1";
		// filename, volume, pitch
		sound[] = {"sounds\STR_OPZ_1.wss", 1, 1};
		// subtitle delay in seconds, subtitle text 
		titles[] = {1, $STR_OPZ_1};
	};
};

4. Mission Editing Dateispezifika

4.1 SQF-Dateien mit Syntaxhighlighting

Wenn du mit Notepad++ arbeitest, kannst du das SQF-Plugin für Autovervollständigung und Syntaxhighlighting nutzen. Achte auf die Readme, die die manuelle Installation genau erklärt. Falls es nicht klappt, weil z. B. die ANSI Version nicht kompatibel ist, einfach die Unicode Version nehmen.
SQF-Plugin

4.2 PBO-Dateien öffnen

Fremde Missionen sind als *.pbo Dateien gespeichert. Auch sind die meisten Mod-Dateien als *.pbo’s abgelegt. Falls Euch der Inhalt interessiert, empfehle ich den PBO-Manager.
PBO-Manager

4.3 PAA-Dateien erstellen

ArmA kann nur bestimmte Bildformate lesen, z. B. *.PAA Dateien. Um aus PNG-Dateien PAA-Dateien zu machen, benötigt man die Software TexView2, welche Teil der Bohemia Interactive Editing Tools Suite - Personal Edition 2 ist.

Verwendet wird die Software TexView wie folgt: Man zieht eine PNG Datei in das TexView Fenster hinein und speichert die Datei ohne Endung ab. Dabei wird automatisch die Endung *.PAA von TexView ergänzt.

Erstellen könnt ihr eigene PNG-Dateien z. B. mit GIMP. GIMP-Dateien speichert man während dem Bearbeiten als ganz normale GIMP *.XCF Dateien. Wenn man fertig ist, exportiert man das Bild und dabei darf die Option "Farbwerte transparenter Pixel speichern" NICHT aktiviert sein.
Bohemia Interactive Editing Tools Suite - Personal Edition 2 Kostenloses Grafikprogramm
GIMP

4.4 Sounddateien, speziell Funksprüche, einspielen

Will man Sounddateien während einer Mission abspielen, so kann dies unabhängig von der aktuellen 3D-Position mit diesem Befehl erledigt werden:
playSound "STR_OPZ_1"; // sucht die gleichnamige Sound-class und spielt diese ab
Soll man den Eindruck bekommen, das Soundfile wird von einem konkreten Objekt im 3D-Raum abgespielt, so lässt sich dies mit folgendem Befehl erreichen.
sprecherNPC say3D "STR_OPZ_1"; // sucht die gleichnamige Sound-class und spielt diese an der Position von sprecherNPC ab
Bevor man die Sounds im Spiel mit den gezeigten Befehlen abspielen kann, muss das entsprechende Soundfile vorab bekannt gemacht werden. Dazu trägt man folgende Zeilen in die description.ext Datei ein:
class CfgSounds
{
	sounds[] = {};
	class STR_OPZ_1 // unter diesem namen sucht der Befehl playSound
	{
		// Im Editor findet ihr die Sound-Datei unter Effekten mit diesem Namen
		name = "STR_OPZ_1";
		// Dateiname, Lautstärke, Tonhöhe
		sound[] = {"sounds\STR_OPZ_1.wss", 1, 1};
		// Nach 1 Sekunde soll folgender Text eingeblendet werden 
		titles[] = {1, “Funkspruch hoert ihr gerade. Hier nun auch als Text.“};
	};
};
Es bleibt die Frage, wie man einen Funkspruch überhaupt aufnimmt. Dazu empfehle ich die Software Audacity.

Um realistisch wirkende Megafon-Durchsagen zu erstellen (Beispiel anhören) empfehle ich folgende Einstellungen in Audacity:
- Effekt/Verstärken +20 db, Übersteuern erlauben (je nach Mikrofon)
- Effekt/Tonhöhe -1,5
- Effekt/Echo Verzögerung: 0,1; Dämpfung: 0,2
- Effekt/Equalizer (siehe beiligende Equalizer-Kurve in eigener Datei)
Abspeichern sollte man die Datei im *.ogg Format, da ArmA nur einige wenige Soundformate unterstützt, wozu eben auch *.ogg gehört.

Vor und hinter die Sounddatei sollte man noch Sounds einfügen, welche den Funkbeginn und das Funkende andeuten. Bestenfalls wären dafür die aus ACRE bekannten Sounds geeignet. Sollte man von den ACRE Autoren die Erlaubnis bekommen (und nur dann!!), verweise ich darauf, dass es technisch gesehen möglich ist, die beiden WAV-Dateien, die in ACRE für Funkbeginn und –ende verwendet werden aus der ACRE DLL zu extrahieren.

Öffnen der ACRE Teamspeak Plug-In DLL mit einem Text-Editor (z. B. NotePad++):
C:\Program Files\TeamSpeak 3 Client_3012\plugins\acre_win64.dll
Suchen nach dem Text RIFF. Alles vor RIFF löschen. Vom Text RIFF (inklusive) an bis zum nächsten Auftreten des Texts RIFF (exklusive) den Text freistellen (umliegenden Text löschen). Den freigestellten Text als Sound1.wav speichern. Ab dem zweiten RIFF (inklusive) bis zum Ende der Datei findet man die zweite WAV-Datei.

Dieses Vorgehen ist jedoch nur erlaubt, falls die ACRE-Autoren hierfür ihr Einverständnis geben. Andernfalls verweise ich auf freesound. Dort gibt es unzählige, teils kostenlose, Sounddateien. Habt ihr den Funkspruch als WAV-Datei fertig, macht ihr zunächst eine WSS-Datei daraus (siehe oben). Anschließend müsst ihr diese WSS-Datei in euren Missionsordner schieben und der Mission bekannt machen. Das Bekanntmachen geschieht durch Einfügen folgender Zeilen an beliebiger Stelle in der description.ext
Militärjargon NATO-Alphabet Kostenlose Sounds auf
freesound.org
Audacity

5. Mission Scripting

Ohne Kommentierung will ich zunächst ein paar wesentliche Quellen rund ums Thema ArmA 2 Mission Editing aufführen:
Assault Mission Studio ArmA2 Biki Diverse ArmA2 Editing Tools

5.1 Allgemeine Skriptbefehle

Lokale Variablen beginnen mit einem Unterstrich, globale Variablen nicht. Alle Befehle werden mit einem Semikolon beendet. Kommentare lassen sich durch zwei Schrägstriche einleiten.
_lokaleVariable
globaleVariable
// Dies ist ein Kommentar
Arrays lassen sich über eckige Klammern definieren. Die einzelnen Items werden durch Kommata getrennt. Durchlaufen kann man das Array mit dem foreach-Befehl, wobei das _x standardmäßig als Stellvertreter für die einzelnen Items steht.
_riflemanWeapons = [
	"M4A3_CCO_EP1",
	"M9SD"
];
{player addWeapon _x} foreach _riflemanWeapons;
Um von einer Einheit aus ein Skript aufzurufen verwendet man folgenden Befehl.
[MeinParameter1,MeinParameter2,MeinParameter3] execVM "scripts\skriptDasDieEinheitAusfuehrenSoll.sqf";
Innerhalb des Skriptes kann ich dann mit folgenden Befehlen auf die drei Parameter zugreifen.
_param1 = _this select 0;
So prüft man, ob ein Objekt nicht null, also bereits definiert, ist:
! (isNull zuPruefenderObjektName)
Pausen lassen sich über den sleep Befehl realisieren.
sleep 3.5; // 3,5 Sekunden warten
Weiterführende Skriptbefehle findet man im BIS-Wiki.
BIS-Wiki

5.2 Skriptausführungsreihenfolge

5.2.1 Bei Missionsstart

Die Reihenfolge, in welcher Skripte ausgeführt werden, kann man auf den offiziellen BIKI Seiten nachlesen (vgl. nachfolgender Link). Zusammenfassend ergibt sich dadurch folgende Reihenfolge:
- Functions with recompile param set to 1 are recompiled
- Functions with preInit param set to 1 are called (client + server)
- Object Init Event Handlers are called
- Object initialization fields are called
- Persistent multiplayer functions are called (client only)
- Modules are initialized
- initServer.sqf is executed (server only)
- initPlayerLocal.sqf is executed
- initPlayerServer.sqf is executed (server only)
- Functions with postInit param set to 1 are called (client + server)
- "BIS_fnc_init" variable is set to true
- init.sqf is executed in multiplayer
MISSION BEGINNT
- Nun werden alle verbundenen player durch die Funktion onPlayerConnected.sqf gejagt
(vorausgesetzt, du verwendest die init.sqf aus diesem Handbuch)
Reihenfolge Skriptausführung
bei Missionsbeginn

5.2.2 Während der Mission

Während einer Mission ist zu beachten, dass man Skripte mit call oder spawn aufrufen kann. Während call ein Skript im selben Thread, also sequentiell, ablaufen lässt, lässt spawn ein Skript parallel in einem neuen Thread ausführen.
_einSkriptSchnipsel = {
    player sidechat “hallo”;
    player sidechat “wie gehts?”;
};
[] spawn _add;
[] call _add;

_meinVorkompiliertesSkript = compile loadFile "meinVorkompiliertesSkript.sqf”;
 _ergebnis = [param1,param2,param3,param4] call _meinVorkompiliertesSkript;
Daraus folgt, dass man Skripts mit Schleifen mit spawn aufruft, sodass die Parallelität zum Hauptskript weiterhin gewährleistet ist. Wird keine Schleife (im Sinne einer Dauerschleife) benötigt, sollte man besser auf call zurückgreifen.

5.3 Multiplayer Mission Editing

Das Mission Editing für Singleplayer Missions unterscheidet sich in einigen Punkten vom Editing von Multiplayer Missions. Dies liegt z. B. darin begründet, dass es entscheidet ist, ob ein Skript auf jedem Client-Rechner oder ausschließlich auf der Server ausgeführt wird. Diese sog. Lokalitätsprobleme werden von Sickboy näher beschrieben.
Lokalitätsprobleme
beschrieben von Sickboy/6th Sense
Hat man das Dokument durchgelesen, versteht man den Hintergrund der Game Logic namens server, welche auf allen Multiplayermissionen platziert ist. Füge eine Einheit ein, mit Game Logic als Seite. Class ist Objects. Unit ist Game Logic. Als Name vergibst du Server. Der als Server fungierende Rechner (entweder Host, wo selbst ein Spieler spielt oder dedicated Server) platziert dieses Modul auf seiner eigenen Map. Die Clients platzieren dieses Modul nicht. Dafür haben die ArmA 2 Programmierer gesorgt. Es lässt sich nun leicht prüfen, ob man ein Skript auf dem Server oder einem Client ausführt, indem man in einer Bedingung eine der folgenden Skriptzeilen verwendet.
? (local server)
? isServer 
Worin unterscheiden sich die beiden Zeilen? Mit isServer prüft man, ob der aktuelle Rechner vom Typ her ein Server ist (analog isPlayer). Mit local server prüft man hingegen, ob das konkrete Objekt server vorhanden ist, was nur auf DEM Server der Fall ist. Da ArmA 2 aber nur einen ausführenden Server kennt, ist es egal, ob man isServer oder local server zur Prüfung heranzieht.

Auch wird durch das Dokument klar, welche Befehle lokal auf dem Client, welche lokal auf dem Server und welche global auf allen Clients ausgeführt werden. Um die Clients darauf reagieren zu lassen, wenn sich eine wichtige globale Variable ändert, muss man bei den Clients einen Event Handler einführen (z. B. in der init.sqf):
"meineGlobaleVar" addPublicVariableEventHandler {hint ("meineGlobaleVar hat nun den Wert " + (_this select 1))};
_this select 1 repräsentiert dabei den neuen Variablenwert. Mit _this select 0 würde man den Variablennamen ausgeben. Der hint Befehl wird ausgeführt, wenn auf dem Server die globale Variable verändert und mittels publicVariable Befehl an die Clients verteilt wird:
meineGlobaleVar  = 44;
publicVariable "meineGlobaleVar”;

5.4 Join in Progress JIP

Wenn man erlaubt, dass Spieler während einer laufenden Mission connecten dürfen (was man tun sollte – Verbindungsabbrüchen vorbeugend) muss man einige JIP-Aspekte beachten. Ich verweise hierbei erneut auf die Seite von 6th Sense.

Um eine Variable, die auf dem Server berechnet wird, auch immer allen Spielern mit dem richtigen Wert zur Verfügung zu stellen, benötigt man den Befehl publicVariable. Auch die Nachzügler, also JIP-Spieler, bekommen dann den gerade aktuellen Wert mitgeteilt.
publicVariable "meineVariableDessenWertAlleKennenSollen";

5.5 Namen von Fahrzeugen, Waffen, Magazinen

Liste vieler Fahrzeuge Liste vieler Gebäude Liste vieler Waffen AddOn ShowClass
Darüberhinaus empfehle ich das Tool mit welchem man sich im Spiel unter anderem die Klassennamen sowie die Dateinamen der jeweiligen p3d-Dateien anzeigen lassen kann und zwar von jenen Objekten, auf welche man gerade schaut.

5.6 Dynamisches Spawnen und Despawnen von Gegnern

Normalerweise kann man in ArmA 2 maximal 144 Einheitengruppen je Seite (West, Ost, Zivil, Widerstand) spawnen lassen. Und auch wenn diese Gruppen über 10 Einheiten stark sein können und man somit theoretisch über 1000 Gegnereinheiten platzieren könnte, rate ich davon ab. Das übermäßige Platzieren von Gegnern kann zu Lags führen.

5.6.1 Editor based AI script by trigger (aka 'Murk Spawn Script')

Eine Möglichkeit Gegner dynamisch spawnen zu lassen besteht darin, das 'Murk' Script zu verwenden. Alle gegnerischen Einheiten werden im Missionseditor platziert. Der jeweilige Gruppenanführer erhält in der init-Zeile eine Anweisung wie diese.
nul = [this, "meinTrigger33", "once"] execVM "murk_spawn.sqf";
Zusätzlich richtet man einen flächigen Trigger ein und benennt diesen 'meinTrigger33'. Den Trigger richtet man mit ONCE/Einmalig ein und sagt an, und fügt in der onAct Zeile folgenden Code ein:
catch_trigger = "meinTrigger33"; publicVariable "catch_trigger";
Das war es auch schon. Wenn die Mission startet lässt das Murk Script zunächst alle gegnerischen Einheiten (bei welchen der Gruppenanführer die gezeigte init Zeile bekommen hat) verschwinden. Gespawnt werden die Gruppen dann erst, wenn der Trigger betreten wird und somit auslöst.

Interessant ist dabei, dass man den Gruppen auch beliebige Wegpunkte zuweisen kann. Diese werden abgearbeitet, sobald die Gruppe spawnt.
'Murk' Script

5.6.2 Dynamic AI Creator

Will man ganze Städte mit Gegnern bevölkern, verweise ich auf das noch mächtigere DAC-Skript. DAC bedeutet Dynamic AI Creator und hilft dabei Computergegner dann spawnen zu lassen, wenn man sie wirklich braucht. Besser ist daher die Nutzung von DAC. Hierzu werden Trigger auf der Karte platziert und so konfiguriert, dass nach Eintreten eines bestimmten Ereignisses eine bestimmte Menge von Gegnereinheiten spawnen. enn diese ausgeschaltet sind, kann man beispielsweise weitere Gegner spawnen lassen. Dadurch sind niemals gleichzeitig zu viele Gegner auf der Karte und der Server bleibt lagfrei. Es handelt sich um ein rein serverseitiges Skript, weshalb die Clients den Mod nicht herunterladen müssen. Ihr müsst den Mod nicht als @-Ordner in euer ArmA 2 Verzeichnis schieben. Es reicht, wenn ihr die DAC-Dateien in euren Missionsordner packt. So ist sichergestellt, dass die DAC-Dateien mit der Mission gleich mitverteilt werden. Bestenfalls habt ihr also einen DAC-Ordner mit folgendem Inhalt in eurem Missionsordner.

Wenn man DAC verwendet, muss man den menschlichen Einheiten Namen zuordnen. Verwendet man die Namen s1 bis s20 hat man kein Problem. Will man andere Namen nutzen, so muss man die Datei DAC_Config_Creator.sqf anpassen. Dort findet man folgende Zeile:
if(isNil "DAC_STRPlayers") then { DAC_STRPlayers = ["s1","s2","s3","s4","s5","s6","s7", …
Aus s1, s2, s3 usw. Muss man nun die Namen machen, die man für die menschlichen Einheiten tatsächlich im Editor verwendet hat. Die Reihenfolge spielt keine Rolle. An dieser Stelle sei auf die umfangreiche Readme von DAC verwiesen, welche man nach dem Herunterladen und Installieren des DAC Addons in folgendem Ordner finden sollte:
C:\Program Files (x86)\Steam\SteamApps\common\Arma 2 Operation Arrowhead\@dac\docs\ger
DAC-Skript

5.6.3 UPSMON

Wie speichert man Einheitensets und lässt diese dann spawnen? Solche Details findet man in den Tiefen der mitgelieferten SQF-Dateien.
UPSMON

5.7 Slotreihenfolge im Lobby-Bildschirm ändern

Standardmäßig entspricht die Reihenfolge der Einheiten in der Lobby der Reihenfolge beim Platzieren der Einheiten. Während man die Mission erstellt, wird man jedoch das Problem haben, dass man meist nicht von Beginn an die perfekte Reihenfolge beim Erstellen der spielbaren Einheiten einhält und somit den Wunsch haben wird, die Reihenfolge im Lobbyscreen zu ändern.

Eine Möglichkeit die Reihenfolge zu ändern besteht darin, die Einheiten neu zu platzieren und diesmal in der richtigen Reihenfolge. Eine andere Möglichkeit besteht darin, die mission.sqm direkt zu editieren. In der mission.sqm findet man die Zeilen
class Groups
{
	…
	class Item0
	{
		…
	}
	class Item1
	{
		…
	}
	…
}
Will man die Reihenfolge der Slots im Lobbybildschirm ändern, muss man lediglich die Items vertauschen und anschließend die Nummern anpassen (also z. B. aus Item1 das Item0 machen und andersherum). Analog geht man vor um die Reihenfolge innerhalb einer Gruppe zu ändern.

5.8 Texteinblendungen

Verwende eine der folgenden Zeilen in deinen Skripten um Texte während der Mission einzublenden.
hint „Das ist ein eingeblendeter Text!“;
nameMeinerEinheit SideChat "Hi there!!!";

5.9 Testen, Debugging und Optimierung

5.9.1 Testen

Manche Multiplayer-Skripte lassen sich erst verifizieren, wenn sie mit mehreren Spieler getestet werden. Für solche Testfälle ist ein Dedicated Server empfehlenswert, also ein angemieteter Rechner, an dem kein Spieler sitzt. Es handelt sich um einen Rechner, welcher keine graphischen Berechnungen durchführt, sondern sich ausschließlich um Objektbewegung, KI-Berechnung, Kommunikation zwischen den Spielern und ähnliches kümmert. Ich empfehle einen Server von nitrado. Dort sollte man jedoch keinen Basic Server sondern einen Public Server wählen, sodass genug Arbeitsspeicher für ArmA 2 zur Verfügung steht, um Lags zu vermeiden.
Nitrado

5.9.2 Debugging

Bei der Fehlersuche hilfreich ist ein Blick in die seitens ArmA 2 generierten *.RPT Dateien. Zu finden ist die RPT hier:
C:\Users\master\AppData\Local\ArmA 2 OA\ArmA2OA.RPT
Willst du selbst etwas in die RPT schreiben, verwende folgende Befehle in deinen Skripten:
diag_log format ["In der RPT sehe ich den Spieler namens %1 zum Zeitpunkt %2", player, time];
Um Variablen während der Vorschau zu ändern oder Skripte zu starten, empfiehlt sich eine Debugkonsole, wie z. B. die von Moricky. Diese wird jedoch unter ACE nicht angezeigt, weshalb Xeno eine leicht modifizierte, unter ACE funktionsfähige Version anbietet.
Erläuterung von
RPT-Dateien
Mit ACE kompatible
Debug-Konsole

5.9.3 Optimierung

ArmA 2 nutzt nur zwei Prozessorkerne. Wenn der Server (gemeint ist hier konkret ein Dedicated Server) mehr als zwei Kerne hat, bleiben diese weiteren ungenutzt. Durch Einbindung eines sog. Headless Client, lassen sich auch die weiteren Prozessorkerne nutzen. Der Headless Client ist quasi eine weitere ausgeführte ArmA 2 Instanz. Der Headless Client loggt sich demnach wie ein normaler Spieler in die Lobby ein. Auf dem HC können Berechnungen ausgeführt werden und zurück an den eigentlichen Server geschickt werden.
Erläuterung der Funktionsweise eines
Headless-Client

5.10 Intros mit Kamera Animation zu Missionsbeginn

In der init.sqf könnte man auf ein Kamera-Intro-Skript verweisen:
_handle = [] execVM "introCam.sqf";
Der Inhalt der introCam.sqf könnte dabei z. B. wie folgt aussehen. Wenn du das Skript für deine Mission verwenden willst, musst du Marker mit den Namen introCam1a, introCam1b, introCam2a, introCam2b usw. bis introCam5b verwenden.
// Kamera Intro Skript von smallfly aka Schmitt

// === Variablen deklarieren und ggf. initialisieren ===

Private [
	"_introKamera", "_camStartPos", "_camEndPos",
	"_timer", "_gesamtDauer", "_camDir", "_camPos",
	"_camMarkerStartEndePaareMitDauerInSek"
];

cutText ["Lade Mission ...", "BLACK FADED"];

SPALTE_INTROCAMSTARTENDE_STARTMARKER = 0;
SPALTE_INTROCAMSTARTENDE_ENDEMARKER  = 1;
SPALTE_INTROCAMSTARTENDE_DAUERINSEK  = 2;

_camMarkerStartEndePaareMitDauerInSek = [
	["introCam1a", "introCam1b", 6],
	["introCam2a", "introCam2b", 6],
	["introCam3a", "introCam3b", 6],
	["introCam4a", "introCam4b", 6],
	["introCam5a", "introCam5b", 6]
];

// === Kamera einrichten und auf den ersten Wegpunkt setzen ===

showCinemaBorder true;
_ersterCamMarker = (_camMarkerStartEndePaareMitDauerInSek select 0) select SPALTE_INTROCAMSTARTENDE_STARTMARKER;
_introKamera  = "CAMERA" camCreate (markerPos _ersterCamMarker); // Kamera erstellen
_introKamera cameraEffect ["Internal", "Back"]; // Kameratyp
_introKamera camSetFOV 1.5; // Kamera Sichtfeld
_introKamera setDir (markerDir _ersterCamMarker); // Kameraausrichtung
_introKamera camPrepareFocus [-1, -1]; // Absolut scharfes Bild ohne Unschärfe am Rand
_introKamera camSetFocus [-1, -1]; // Absolut scharfes Bild ohne Unschärfe am Rand
_introKamera camCommit 0; // Kameraeinstellungen anwenden

{
	Private ["_startMarker", "_endeMarker", "_dauerInSek",
	"_camStartPos", "_camEndPos", "_timer", "_dirVector"];
	
	_startMarker = _x select SPALTE_INTROCAMSTARTENDE_STARTMARKER;
	_endeMarker  = _x select SPALTE_INTROCAMSTARTENDE_ENDEMARKER;
	_dauerInSek  = _x select SPALTE_INTROCAMSTARTENDE_DAUERINSEK;
	
	_camStartPos = markerPos _startMarker;
	_camEndPos   = markerPos _endeMarker;
	
	_timer = 0.0;
	_ausblendenGestartet = false;

	titleText ["", "BLACK IN", 2.5];
	
	while {_timer < _dauerInSek} do
	{
		// === Interpolation von Kameraposition und -winkel zwischen Start- und Endemarker ===
		
		_camPos = [
			(_camStartPos select 0) + (_timer / _dauerInSek) *
				((_camEndPos select 0) - (_camStartPos select 0)),
			(_camStartPos select 1) + (_timer / _dauerInSek) *
				((_camEndPos select 1) - (_camStartPos select 1)),
			(3.0 + (_camStartPos select 2)) + (_timer / _dauerInSek) *
				((_camEndPos select 2) - (_camStartPos select 2))
		];
		
		_camDir = (markerDir _startMarker) + (_timer / _dauerInSek) *
			((markerDir _endeMarker) - (markerDir _startMarker));

		_introKamera camSetPos _camPos; // Kameraposition setzen
		//_introKamera setDir _camDir; // Kamerablickwinkel setzen
		
		_dirVector = [
			(_camEndPos select 0) - (_camStartPos select 0),
			(_camEndPos select 1) - (_camStartPos select 1),
			(_camEndPos select 2) - (_camStartPos select 2)
		];
		_introKamera setVectorDirAndUp [_dirVector, [0, 0, 1]];
		_introKamera camCommit 0; // Geänderte Kameraeinstellungen anwenden

		if (!_ausblendenGestartet && _timer > ((2.0/3.0) * _dauerInSek)) then {
			titleText ["", "BLACK OUT", ((1.0/3.0) * _dauerInSek)];
			_ausblendenGestartet = true;
		};
		
		sleep 0.05; // Hundertstel Sekunde warten
		_timer = _timer + 0.05; // Speichern, dass eine Hundertstel Sekunde vergangen ist
	};
}
forEach _camMarkerStartEndePaareMitDauerInSek;

// === Kamera zerstören und somit zur Egoperspektive der Spielers zurückkehren ===

_introKamera cameraEffect ["TERMINATE","BACK"];
camDestroy _introKamera;

titleText ["", "BLACK IN", 1.0];
Potentielle
Intro-Musik

6. Für das Mappen erforderliche Software

Zunächst eine Auflistung der entsprechenden Quellen, wo ihr notwendige Software/Tools herbekommt:
Visitor3, BinPBO, TexView2 als Teil der
BIS Tools
Baum- und Zaungeneratoren
World Tools
PBO-Manager Heightmap Generator
L3DT
Arma2P
als Teil der mikero Tools
ExtractPbo
als Teil der mikero Tools
DePbo
als Teil der mikero Tools

Installationsreihenfolge

Zum Entpacken von PBOs empfiehlt sich der PBO-Manager. Nach dessen Installation nistet sich dieser im Windows-Kontextmenü ein (vgl. nachfolgender Screenshot), sodass man PBO durch Rechtsklick auf einen Ordner erstellen kann, bzw. PBOs durch einen Doppelklick entpacken kann.

Nun die BIS (Bohemia Interactive Suite) Tools installieren. Dazu einfach die BI_Editing_Tools_2_Setup.exe starten und alle Abfragen mit "OK" bestätigen. Am Ende habt ihr diesen Ordner:

Und außerdem sollte nachfolgender Ordner entstanden sein:
C:\Users\master\Documents\ArmAWork\ (statt "master" dein User)
Dieser Ordner ist verlinkt mit dem Laufwerksbuchstaben P:/. Ihr solltet also jetzt eine neue "Festplatte" P:/ angezeigt bekommen. Falls nicht, findet ihr weiter unten die Lösung, wie ihr dieses ominöse P:/ Laufwerk selber erstellen könnt.
Nach Download der World Tools erhält man die Datei worldtools1_8_0.zip, worin sich die zu startende Setup.msi Datei befindet. Während der Installation empfehle ich zur besseren Übersicht folgenden Ordner zu nutzen (Ordner neu zu erstellen), obwohl die World Tools offiziell nicht zu den BIS Tools gehören.

Bzgl. L3DT empfehle ich die Professional Edition, zumal sich damit größere Texturen erstellen lassen. Will man nur sehr kleine Maps erstellen, reicht die Standardversion zunächst aus.

Auch bzgl. L3DT nutze ich persönlich bei der Installation den BIS Ordner. Gehört zwar nicht zu den BIS Tools, aber dann hab ich alle Tools an einem Ort zusammen. ArmA Editing ist kompliziert genug.

6.0 Verweis auf bestehende Mapping Tutorials

Es gibt bereits gute Tutorials zum Thema ArmA 2 Mapping. Diese sollte man vorab durcharbeiten, bevor man die nächsten Kapitel liest.
Mondkalbs Terrain Tutorial Bedeutung von Nametags Bushs Microterrain Beginners Guide Waldgenerierung mit den
World Tools
Road Painter Tool (*)
(*) Meines Wissens platziert der Road Painter einzelne Road Elemente als Einzelobjekte. Im Gegensatz dazu lässt sich via Visitor 3 ein echtes Straßennetzwerk erstellen. Der Unterschied liegt meiner Meinung darin, dass die KI Straßennetzwerke ordentlich befahren kann, weil die KI dann weiß, welche Straßenelemente mit welchen anderen zusammenhängen. Es gibt auch Leute, die der Meinung sind, dass es keinen Unterschied macht.

6.1 Einrichtung des virtuellen P: Laufwerks

Manch einer hat Angst vor der Installation der BIS Tools, weil dabei scheinbar eine P: Partition erstellt wird.
Tatsächlich wird jedoch nur eine Verknüpfung angelegt. Ein ganz normaler Ordner auf einer existierenden Partition wird verlinkt mit dem Buchstaben P. Unter Windows 8.1 hat die BIS Tools Installation Probleme das scheinbare P Laufwerk zu erstellen. Da muss man manuell nachhelfen. Zunächst sollte man sicherstellen, dass man diesen Ordner bereits hat:
C:\Users\master\Documents\ArmAWork\ (statt "master" dein User)
Dieser sollte im Rahmen der BIS Tools Installation erstellt worden sein. Wenn nicht, jetzt manuell erstellen. Dann via WIN+R in die Ausführungszeile, dort cmd eingeben und bestätigen. Nun ist man in der Eingabeaufforderung (schwarz/weiße Maske). Dort kann man nun ein Verzeichnis mit dem Laufwerksbuchstaben P verlinken und zwar mit diesem Befehl, den man mit Enter abschließt:
subst p: "C:\Users\master\Documents\ArmAWork\" (statt "master" dein User)
Ich persönlich lasse das von den BIS-Tools benötigte virtuelle Laufwerk P: nicht auf C: verweisen, sondern habe mir auf einer externen Platte einen gleichnamigen Ordner angelegt. Wie im folgenden Screenshot erkennbar, nutzt das P: Laufwerk in meinem Fall physisch das F: Laufwerk (exakt gleiche Speicherplatzbelegung).

Im "Laufwerk" P bitte manuell folgendes Verzeichnis anlegen, welches später von dem Tool Arma2P gebraucht wird.
P:\bin_temp\
So sieht das "Laufwerk" P: bei mir aus:

6.1.1 PBOs ins P: Laufwerk extrahieren

Das Extrahieren der PBOs in den Zielordner
P:\ca
ist notwendig, damit Visitor 3 die Objekte im Bulldozer (3D Vorschaufenster) anzeigen kann.

Das Extrahieren der PBO sollte NICHT mit dem PBO-Manager sondern mit der extractPBO.exe passieren (vgl. Screenshot).

Geht man so vor, hat man unter anderem keine config.bin (Binärdateien) sondern config.cpp Dateien (Textdateien). Diese werden im nächsten Schritt gebraucht.

6.1.2 config.cpp Dateien kopieren

Vorausgesetzt man hat bereits fleißig alle PBOs aus dem Verzeichnis
C:\Program Files (x86)\Steam\steamapps\common\Arma 2 Operation Arrowhead\AddOns
entpackt und zwar hier hinein:
P:\ca
sodass du nun Verzeichnisse hast wie z. B. die folgenden
P:\ca\buildings\Data
P:\ca\plants2\tree\Data
P:\ca\misc2\SmallTable\Data
dann wirst du feststellen, dass in eben diesen Verzeichnissen viele config.cpp Dateien zu finden sind. Diese Dateien sind relevant, wenn man Türen, Leitern, Kirchglocken usw. funktionsfähig machen will. All diese config.cpp Dateien müssen dazu in deinem Projektverzeichnis
P:\SMY
bekannt gemacht werden. Genauer in einem Verzeichnis mit derselben Struktur, wie das Verzeichnis
P:\ca
nur mit dem Unterschied, dass keine vollständige Kopie aller Dateien, sondern nur die config.cpp Dateien gebraucht werden. Ziel ist es also z.B. folgende Kopien zu haben:
P:\SMY\ca\misc3\WF\config.cpp
P:\SMY\ca\buildings\config.cpp
P:\SMY\ca\air3\SU34\config.cpp
Da es Ewigkeiten dauern würde, diese Dateien zu finden und in die richtigen Zielordner zu kopieren, eignet sich ein Aufruf der Eingabeaufforderung. Dort navigiert man zum Ordner P:\ca und gibt dann diesen Befehl ein, den man natürlich mit Enter bestätigen muss:
xcopy *.cpp P:\SMY\ca\ /S /Y
Das sieht dann z. B. so in der Eingabeaufforderung aus, bevor ihr Enter drückt.

Nach erfolgreichem Durchlauf sollten mehrere dutzend/hunderte *.cpp Dateien kopiert worden sein. Im gezeigten Beispiel sind es nur 131 Dateien, weil ich nur wenige Addons in den Ordner P:/ca/ entpackt habe. Bei weitem nicht alle ArmA2 PBOs.

6.2 Arma2P

Bei der Software Arma2P ist der Name Programm. Seine Aufgabe ist es die PBOs aus dem Verzeichnis
C:\Program Files (x86)\Steam\steamapps\common\Arma 2 Operation Arrowhead\AddOns
zu finden und in folgenden Verzeichnis zu entpacken:
P:\ca
Ich persönlich habe das Programm Arma2P in folgenden Ordner installiert:
C:\Program Files (x86)\Bohemia Interactive\Tools\Arma2P.2.5.1c

6.3 Visitor 3

Visitor 3 ist der eigentliche Map Editor für ArmA 2. Wenn man damit eine Map erstellt, sieht das z. B. wie folgt aus:

In Visitor 3 unter Tools > System Preferences empfehlen sich folgende Einstellungen:
"p:\buldozer.exe" -window -buldozer -cfg=bdozer.cfg -profiles=P:\ -name=smallfly
-addons=p:\V3addons.txt -exthreads=0 -cpuCount=2 -noPause
Der Befehl -profiles=P:\ -name=smallfly sorgt dabei dafür, dass folgende Datei erstellt wird:
P:\Users\smallfly\smallfly.ArmA2OAProfile
Diese kann man mit neuen Werten überschreiben (z. B. Fenstermodus statt Vollbild und ähnliches). Meine Datei sieht beispielsweise inhaltlich so aus:
version=1;
blood=1;
singleVoice=0;
shadingQuality=10;
shadowQuality=3;
maxSamplesPlayed=32;
anisoFilter=2;
TexQuality=1;
TexMemory=1;
useWBuffer=0;
tripleHead=0;
sceneComplexity=300000;
viewDistance=10000;
terrainGrid=10;
volumeCD=6.5;
volumeFX=8.5;
volumeSpeech=5.5;
volumeVoN=6.5;
vonRecThreshold=0.029999999;
gamma=1;
brightness=1;
fovTop=0.75;
fovLeft=1;
uiTopLeftX=0;
uiTopLeftY=0;
uiBottomRightX=1;
uiBottomRightY=1;
IGUIScale=1;
Ein Problem hat Visitor 3 seltsamerweise bei der Installation. Dabei wird eine Datei nicht angelegt, welche gebraucht wird, um Namen von Städten und wichtigen Gebieten in Visitor definieren zu können.

Im Visitor Verzeichnis muss eine Textdatei mit folgendem Namen gespeichert werden:
C:\Program Files (x86)\Bohemia Interactive\Tools\Visitor 3\KPtypes.dat
Und das muss der Inhalt sein:
Hill
BorderCrossing
VegetationBroadleaf
VegetationFir
VegetationPalm
VegetationVineyard
NameMarine
NameCityCapital
NameCity
NameVillage
NameLocal
RockArea
ViewPoint
Wenn dann mal ein eigenes Projekt angelegt wird, könnten die Projekteinstellungen z. B. so aussehen:

6.3.1 Objekte verfügbar machen

Damit man unter Artifical Objects überhaupt Objekte aufgelistet bekommt, die man dann per einfachen Linksklick auf der Map platzieren kann, muss zunächst jedes einzelne Objekte mühselig importiert werden. Dazu klickt man auf Tools > Artifical Objects.

Via Add/Browse wählt man dann die meist tschechisch oder englisch benannte p3d-Datei des gewünschten 3D-Objektes aus und importiert das Objekt. Jetzt steht das Objekt zwecks Platzierung im Editor zur Verfügung.
Tool zum schnellen Importieren aller ArmA 2 Objekte in Visitor 3 ZGM Tools - In Visitor3 und WorldTools alle Objekte mit Bildern verfügbar machen

6.3.2 Verlegen von Straßen

Um Straßen verlegen zu können, muss zunächst mindestens ein vollständiges Roadset definiert werden. Dazu geht man unter Tool > Roads und fügt via Add ein neues Road Set hinzu.

Ein vollständiges Road Set besteht aus mehreren unterschiedlich langen Geraden
asf1_6
asf1_12
asf1_25
asf1_6_crosswalk			
Hinzukommen Kurven verschiedener Radien:
asf1_10 25
asf1_10 50
asf1_10 75
asf1_10 100			
Außerdem braucht man diverse Kreuzungen und T-Kreuzungen (hinzuzufügen unter Special Parts):
kr_t_asf1_asf2
kr_t_asf1_asf3
kr_t_a
sf1_city
kr_x_asf1_asf3
kr_x_asf1_city
Nicht zu vergessen mindestens ein Straßenendstück:
asf1_6konec
Während sich das gezeigte Beispiel auf die Straßenoptik asf1 bezieht, kann man natürlich auch Road Sets mit anderem Aussehen als asf1 definieren.

6.4 Heightmap Generators L3DT

Um das Höhenprofil, also Berge und Täler, zu generieren, könnte man jeden Vertex der Karte einzeln hoch- und runterziehen. Das dauert nur in etwas 10 Jahre. Will man seine Karte etwas schneller generieren, nutzt man ein externes Tool und importiert das Ergebnis danach wieder in Visitor 3.

Ein solches externes Tool ist L3DT. Damit lässt sich binnen Sekunden eine weitestgehend zufällig generierte Heightmap generieren, die dann z. B. so aussieht:

In einem bequemen 3D-Editor lässt sich das Höhenprofil dann anpassen:

Praktisch ist dabei, dass man eine aus Visitor 3 exportierte Minimap seiner Insel als Textur exportieren und in L3DT importieren kann. So lässt sich der Bereich exakt unter Straßen und Gebäuden planieren.

Aus Visitor 3 mittels "Project" > "Export as image" exportierte Bilder liegen im *.EMF Format vor. Um daraus ein PNG zu machen, zieht man die EMF-Datei einfach auf folgende EXE-Datei:
C:\Program Files (x86)\Bohemia Interactive\Tools\Visitor 3\EmfToPng.exe

Auch lässt sich mit L3DT das Satellitenbild passend zur Höhenkarte generieren (und später in Visitor 3 importieren). An dieser Stelle gleich der Tipp, dass man die Option 'High Resolution' mit Faktor 4 oder sogar 8 auswählt um eine hochauflösende und somit schön aussehende Satmap zu generieren. Diese ist im Spiel später sichtbar, wenn man Gelände aus größerer Entfernung betrachtet und somit die detaillierten Nah-Bodentexturen nicht mehr sichtbar sind.

6.5 Installation der World Tools

6.5.1 Generierung von Bäumen, Büschen und Steinen

6.5.2 Generierung von Zäunen

Bei der Generierung von Zäunen äußerst hilfreich ist es beim Starten eines neuen Projekts (File > New Project) eine Satmap oder Minimap in der Pixelgröße der Insel (1 Pixel ist 1 Meter) per "Load Image" hochzuladen.

Um Zäune überhaupt mittels World Tools verlegen zu können, muss man zunächst im Object Manager den gewünschten Zäunen (konkret dem Mittel- und dem Endstück des gewünschten Zauntyps) Hotkeys zuweisen (z. B. F1 und F2).

Danach klickt man auf die Satmap und wählt den Startpunkt fürs Zaunverlegen. Und erst jetzt beginnt mit einem Klick auf Directions die eigentliche Verlegearbeit indem man nach und nach durch Klick auf eine Orientierungsangabe (Winkel) das nächste Zaunstück platziert. Will man einen anderen Zauntyp so wechselt man mit F1 und F2 durch.

6.6 Testen der eigenen Insel in ArmA2

6.6.1 Binärisieren der Inselfiles mittels BinPBO



*.pac;*.paa;*.rtm;*.sqf;*.sqs;*.bikb;*.fsm;*.wss;*.ogg;*.wav;
*.fxy;*.csv;*.html;*.lip;*.txt;*.sqm;*.ext;*.bisurf;*.rvmat

6.6.2 Bekannte/häufige Probleme beim Mappen eigener Inseln

Leitern funktionieren nicht, kein Mausradmenüpunkt?

Um ehrlich zu sein, ich habe es auch noch nicht hinbekommen, dass meine Leitern (z. B. die der Feuerwehrwache) funktioniert. Vielleicht hast du mehr Glück. In diesem Thread wurde darüber diskutiert.

Wichtigster Punkt: Du musst alle config.cpp (nicht config.bin!) in den richtigen Verzeichnissen (ca Ordner innerhalb deines Map Ordners) haben.

Graslücken im Straßennetzwerk?

Texture Layer Size muss größer sein als die Cell Size! Siehe diesen Thread.

Welche Größe müssen Satmap, Satmask, Baummaske usw. haben?

PLATZHALTER

7. ArmA 2 interner 3D Missionseditor

Es gibt tatsächlich einen 3D Mission Editor in ArmA 2. Wie man da rankommt, zeigt das verlinkte Video-Tutorial. Kurz gesagt, man muss im Startbildschirm von ArmA 2 die Tastenkombination Alt+E drücken, dann die gewünschte Insel auswählen und los gehts. Wichtig: Speichern kann man erst, wenn man mindestens ein Center (West), mindestens eine Group (zu diesem Center zugehörig) und mindestens eine Einheit (dieser Gruppe) platziert hat.
Tutorial über den
ArmA 2 internen 3D Mission Editor

8. Deine Anmerkungen via Shoutbox