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.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.
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.
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
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:
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 ;-)
So viel zum allgemeinen Teil. Als nächstes folgt ein Kapitel über das Mission Editing in
ArmA 2.
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.
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
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.
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.
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];
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.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.
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.
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.
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
Ohne Kommentierung will ich zunächst ein paar wesentliche Quellen rund ums Thema ArmA 2 Mission Editing aufführen:
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.
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)
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.
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
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.
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
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.
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.
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.
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.
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];
Zunächst eine Auflistung der entsprechenden Quellen, wo ihr notwendige Software/Tools herbekommt:
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.
(*) 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.
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
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.