ArmA3 |
Das Editieren von ArmA3 Terrains ist nur möglich, wenn man auch ArmA3 installiert hat. Klingt trivial, aber es gibt auch Spiele, bei denen der Mapeditor losgelöst vom
Spiel funktioniert, daher sei dies hier erwähnt.
Empfohlener Installationspfad: D:\SteamLibrary\SteamApps\common\Arma 3 |
DePbo |
Der 'Terrain Builder' kann mit den PBOs von ArmA3 nichts anfangen. Er benötigt diese in entpackter Form und zwar im P-Laufwerk. Um PBOs zu entpacken
benötigt man das Tool 'DePbo'. Ich empfehle allerdings auf den manuellen Gebrauch von 'DePbo' zu verzichten, also nicht manuell alle PBOs einzeln anzuklicken
und mit 'DePbo' zu entpacken. Installiert werden muss 'DePbo' aber schon. Diese Aufgabe übernimmt die Batch-Datei 'ArmA3p'.
Empfohlener Installationspfad: C:\Program Files (x86)\Mikero\DePboTools\bin |
ExtractPbo |
'ExtractPbo' ergänzt die Funktionalität von 'DePbo'. Finger weg von der manuellen Nutzung. Einfach nur Installieren, damit 'ArmA3p' das Tool finden kann.
Empfohlener Installationspfad: C:\Program Files (x86)\Mikero\DePboTools\bin |
DeRap |
Wenn man eine PBO-Datei entpackt, sind daran meist ein oder mehrere Konfigurationsdateien 'config.bin' zu finden. Diese sind binärisiert und können so nicht
vom 'Terrain Builder' gelesen werden. Um die Binärisierung rückgängig zu machen, nutzt man das Programm 'DeRap'. Allerdings gilt auch hier, dass ich von der
manuellen Nutzung des Tools abrate. Man muss es lediglich installieren. Das Anwenden überlässt man der Batch-Datei 'ArmA3p'.
Empfohlener Installationspfad: C:\Program Files (x86)\Mikero\DePboTools\bin |
VC++ 2012 Redistributable Update 4 |
'ArmA3p' benötigt einige DLL Dateien aus dem 'VC++ 2012 Redistributable Update 4', also bitte auch diese Datei installieren.
Empfohlener Installationspfad: Wie vom Installationsprogramm automatisch vorgeschlagen |
ArmA3p |
Mit 'ArmA3p' können wir alle 3D-Objekte aus dem ArmA3 Verzeichnis aus den *.PBO Dateien
extrahieren und ins P-Laufwerk entpacken. Dadurch stehen die 3D-Objekte im 'Terrain Builder' zur Verfügung und können dort platziert und angezeigt werden.
Bei 'ArmA3p' handelt es sich um eine gewöhnliche Batch-Datei, also um eine Datei zur Stapelverarbeitung von Befehlen. Auf den Folgeseiten wird auch gezeigt, wie wir dieser Stapelverarbeitung beibringen, dass nicht nur originale ArmA3 PBOs entpackt werden sollen, sondern auch die hilfreichen neuen PBOs des 'x-cam' Addons. Empfohlener Installationspfad: C:\Program Files (x86)\Mikero\DePboTools\bin |
L3DT Professional |
Im 'Terrain Editor' kann man jeden Vertex einzeln in seiner Höhe verschieben. Dann dauert es nur angenehme tausend Jahre und schon hat man Oberflächenform eine Karte fertig.
Schneller gehts mit einem Heightmap Editor wie 'L3DT', welcher auf Basis einiger Parameter eine zufällige Höhenkarte erstellen kann. Das schöne dabei ist,
dass nicht nur eine Höhenkarte, sondern auch eine Satellitenkarte generiert wird. Beides lässt sich dann im 'Terrain Builder' importieren. Besser noch:
Es lässt sich von 'L3DT' sogar eine Landschaftstypmaske exportieren, welche auf Basis von knalligen Farben dem Spiel verrät, auf welchem Quadratmeter
welche Detailtextur (Grass, Stein, Sand ...) anzuzeigen ist.
Empfohlener Installationspfad: C:\Program Files (x86)\Bohemia Interactive\Tools\L3DT Professional 11.11 (auch wenn L3DT nicht von Bohemia stammt) |
ArmA3 Tools |
Die 'ArmA3 Tools' können bequem über 'steam' installiert werden und enthalten ein Programm, um das magische 'P-Laufwerk' zu erstellen,
sowie u.a. die Programme 'Terrain Builder' und 'Addon Builder'.
Empfohlener Installationspfad: D:\SteamLibrary\SteamApps\common\Arma 3 Tools |
A3Tools: Terrain Builder | Der 'Terrain Builder' ist verfügbar, sobald man die 'ArmA3 Tools' über 'steam' installiert hat. Mit diesem Programm kann man die Höhenkarte, Satellitenkarte und Landschaftstypmaske aus 'L3DT' importieren und dann mittels Vektoren Straßenverläufe angeben. Lädt man die Karte dann in ArmA3 können mittels 'x-cam' Objekte platziert werden und als Textdatei exportiert werden. Zurück im 'Terrain Builder' können die Objekte über die Textdatei importiert werden, um die Karte zu vervollständigen und die finale Karte inkl. Objekten zu exportieren. |
A3Tools: Addon Builder | Der 'Addon Builder' ist verfügbar, sobald man die 'ArmA3 Tools' über 'steam' installiert hat. Mit diesem Programm kann man die vom 'Terrain Builder' exportierte *.WRP Datei inkl. der vom 'Terrain Builder' generierten Landschaftstexturabschnitte in eine *.PBO packen. Die *.PBO kann dann in einen frei benennbaren ArmA3 Addon Ordner gepackt werden und schon kann man seine eigene Karte in ArmA3 verwenden. |
A3Tools: Terrain Processor | Der 'Terrain Processor' ist verfügbar, sobald man die 'ArmA3 Tools' über 'steam' installiert hat. Trotz der Möglichkeiten von 'Terrain Builder' via Polygonen Objekte zu importieren und trotz des Multibrushes in 'x-cam', ist es sehr nützlich, dass es einen Weg gibt, sehr schnell eine ganze Karte zu bewalden. Dafür erstellt man zunächst eine Shape Datei *.SHP, welche in Formensprache darstellt, wo überall Wälder sind. Diese Datei kombiniert man der Straßen Shape Datei *.SHP, welche vom 'Terrain Builder' exportiert wird und die Schnittfläche lässt man dann mit dem Programm 'Terrain Processor' bewalden. Dieses Programm ist übrigens Teil der 'ArmA3 Tools' in 'Steam'. |
Notepad++ | 'Notepad++' ist eine leistungsfähiger Texteditor. Ich bin ehrlich: Es tut auch jeder andere. Meine Empfehlung zum Editieren von ArmA3 Konfigurationsdateien ist eben 'Notepad++'. |
GIMP | 'GIMP' (oder alternativ 'Photoshop') braucht man, um auf den mittels 'L3DT' generierten Satellitenkarten und Landschaftstypmasken Straßen einzuzeichnen. Dabei sollte man die Straßen auf einer eigenen Ebene zeichnen und dann das Ergebnis als *PNG Dateien exportieren und im 'Terrain Builder' die überarbeitete Satellitenkarte importieren. Dieser Schritt ist wichtig, da ArmA3 auf große Distanz keine Straßen mehr anzeigt. Um die Illusion zu generieren, die Straße wäre noch da, muss man die Straße durch graue Flächen auf der Satellitenkarte andeuten. |
C:\Users\master\Documents\Arma 3 Projects
subst p: "C:\Users\master\Documents\Arma 3 Projects"
Mit folgendem Befehl kann man das Anbinden übrigens wieder rückgängig machen, sodass der Buchstabe P: nicht länger mit dem oben genannten Verzeichnis in Verbindung steht:
subst p: /D
Neben dem Tool 'Mount P: Drive' sind für uns vor allem die beiden Tools 'Terrain Builder' und 'Addon Builder' relevant.
Die beiden Tools haben hier
auf der Webseite aufgrund ihres Umfangs einen eigenen Bereich.
C:\Program Files (x86)\Mikero\DePboTools\bin
Zum Vergleich hier ein Screenshot meines Ordners, in welchem ich alle mikero Tools abgespeichert habe.
rem Die folgenden drei Zeilen sind unveraendert
echo extracting the addons folder....
extractpbo -p "%_ARMA3PATH%\Addons" p:\
if ERRORLEVEL 1 goto err
rem Ergaenzt von Schmitt um auch die AiA Dateien zu extrahieren
echo extracting the allinarma addons folder....
extractpbo -p "%_ARMA3PATH%\@AllInArmaDataTerrainPack\addons" p:\
if ERRORLEVEL 1 goto err
D:\SteamLibrary\SteamApps\common\Arma 3\Addons
extrahiert ins Verzeichnis
P:\a3
Sodass man Ergebnis folgende Ordnerstruktur vorfindet:
P:\ca
worin sich alle ArmA2 Inhalt befinden.
P:\xCam\data
P:\xCam\xcam_objects
P:\xCam_Metal\data
P:\xcam_pipe\Pipe\Data
P:\xcam_wood\data
P:\xCam_Woodworks\data
Die dafür zu extrahierenden Pbos findet ihr im Order
D:\SteamLibrary\SteamApps\common\Arma 3\@xCam\addons
Aber natürlich nur, wenn ihr x-cam bereits installiert habt.
P:\a3\rocks_f\sharpRock_spike.p3d
P:\a3\rocks_f\sharpRock_wallH.p3d
P:\a3\rocks_f\sharpRock_wallV.p3d
...
Und die schönen (weil texturierten) Versionen sind hier zu finden:
P:\a3\rocks_f\Sharp\sharpRock_spike.p3d
P:\a3\rocks_f\Sharp\sharpRock_wallH.p3d
P:\a3\rocks_f\Sharp\sharpRock_wallV.p3d
...
Insgesamt sprechen wir über diese Dateien, welche in schön und in hässlich vorliegen:
P:\sunIsland\source\terrainTypMaske_4096x4096 palette.txt
Die Datei braucht man später um Attributkarten, die man in einem externen Grafikprogramm verfeinert hat, wieder in L3DT zu importieren,
sodass die Farben der Attributkarte wieder korrekt interpretiert werden.
R, G, B, Climate, Land type
0, 255, 0, "SunIslandClimate", "grass",
255, 255, 0, "SunIslandClimate", "sand",
0, 0, 0, "SunIslandClimate", "rock",
255, 100, 0, "SunIslandClimate", "kaumbewachsen",
0, 150, 0, "SunIslandClimate", "waldboden",
120, 120, 120, "SunIslandClimate", "asphalt",
Unter 'Appearance' muss man jeweils noch ein passendes Material wählen.
P:\sunIsland\l3dt\Materials
Darin sollten sich derartige Dateien befinden:
class Clutter
{
class StrBigFallenBranches_pine: DefaultClutter
{
model = "A3\Plants_F\Clutter\c_bigFallenBranches_pine.p3d";
affectedByWind = 0.0;
swLighting = "false";
scaleMin = 0.3;
scaleMax = 0.7;
};
class StrGrassGreenGroup: DefaultClutter
{
model = "A3\plants_f\Clutter\c_StrGrassGreen_group.p3d";
affectedByWind = 0.6;
swLighting = "true";
scaleMin = 0.7;
scaleMax = 1.0;
};
class StrGrassDry: DefaultClutter
{
model = "A3\plants_f\Clutter\c_StrGrassDry.p3d";
affectedByWind = 0.5;
swLighting = "true";
scaleMin = 0.8;
scaleMax = 1.2;
};
(...)
class Coral4: DefaultClutter
{
model = "A3\Plants_F\Clutter\c_Coral4.p3d";
affectedByWind = 0.1;
swLighting = "false";
scaleMin = 0.3;
scaleMax = 1.0;
};
class Coral5: DefaultClutter
{
model = "A3\Plants_F\Clutter\c_Coral5.p3d";
affectedByWind = 0.05;
swLighting = "false";
scaleMin = 0.2;
scaleMax = 0.6;
};
};
In der 'cfgClutter.hpp' ist also definiert, welche Sträucher und Steine "so rumstehen".
Für diese zufällig auf dem Gelände verteilten Objekte kann man zufällige Größen definieren zwischen 'scaleMin' und 'scaleMax'. Auch lässt sich einstellen,
wie stark das jeweilige Objekt vom Wind beeinflusst wird (vgl. 'affectedByWind'). Das wichtigste ist hierbei, dass ein konkretes 3D-Modell über den Parameter
'model' zugewiesen wird.
class CfgSurfaces
{
class Default{};
class Water{};
class GdtConcrete: Default
{
access = 2;
files = "gdt_concrete_*";
character = "Empty";
soundEnviron = "concrete";
soundHit = "concrete";
rough = 0.05;
maxSpeedCoef = 1;
dust = 0.15;
lucidity = 0.3;
grassCover = 0.0;
impact = "hitConcrete";
};
class GdtStratisGreenGrass: Default
{
access = 2;
files = "gdt_grass_green_*";
character = "StratisGreenGrassClutter";
soundEnviron = "grass";
soundHit = "soft_ground";
rough = 0.08;
maxSpeedCoef = 0.9;
dust = 0.15;
lucidity = 4;
grassCover = 0.05;
impact = "hitGroundSoft";
surfaceFriction = 1.7;
};
(...)
class GdtForestPine: Default
{
access = 2;
files = "gdt_forest_pine_*";
character = "ForestPineClutter";
soundEnviron = "drygrass";
soundHit = "soft_ground";
rough = 0.12;
maxSpeedCoef = 0.8;
dust = 0.4;
lucidity = 3.5;
grassCover = 0.04;
impact = "hitGroundSoft";
surfaceFriction = 1.7;
};
};
class CfgSurfaceCharacters
{
class StratisForestPineClutter
{
probability[] = {0.05,0.012,0.01,0.1,0.05};
names[] = {"StrBigFallenBranches_pine","StrBigFallenBranches_pine02","StrBigFalle... (gekürzt)
};
class StratisDryGrassClutter
{
probability[] = {0.21,0.35,0.21,0.09,0.06,0.02};
names[] = {"StrGrassDryGroup","StrGrassDryMediumgroup","StrWeedBrownTallGroup","Str... (gekürzt)
};
class StratisGreenGrassClutter
{
probability[] = {0.95,0.02,0.02,0.01};
names[] = {"StrGrassGreenGroup","StrThornGreenSmall","StrThornGreenBig","StrPlantGreenShrub"};
};
(...)
class SeabedClutter
{
probability[] = {0.4,0.2,0.1,0.01,0.1,0.09,0.1};
names[] = {"SeaWeed1","SeaWeed2","Coral4","Coral1","Coral5","Coral3","Coral2"};
};
};
Innerhalb der Klasse 'CfgSurfaces' enthält jede Oberfläche eine eigene Klassendefinition, worin steht, wo Material- und Texturdateien zu dieser Oberfläche zu finden sind.
Oberflächen sind z. B. Gras, Sand, Waldboden usw. Schauen wir uns z. B. die normale saftig grüne Wiese an, die wir hier "GdtStratisGreenGrass" genannt haben.
Darin finden wir unter 'character' den Wert "StratisGreenGrassClutter". Das bedeutet nun, dass auf das Gelände "GdtStratisGreenGrass" all jene Büsche, Steinchen und ähnliches verteilt werden sollen,
welche in der Clutter Gruppe "StratisGreenGrassClutter" zu finden sind.
class farosCityKp
{
name="Faros";
position[]={1456.66,3087.76};
type="NameCityCapital";
radiusA=284.77;
radiusB=268.75;
angle=0.000;
};
class schuhfabrikKp
{
name="Schuhfabrik";
position[]={821.02,3140.14};
type="Hill";
radiusA=93.31;
radiusB=88.06;
angle=0.000;
};
Die drei *.hpp Dateien sind im Grunde nur ausgelagerte Dateien, damit die Datei 'config.cpp' nicht noch länger wird, als sie sowieso schon ist.
Wirft man einen Blick in die nachfolgende 'config.cpp', stellt man fest, dass an ein drei Stellen über den Präprozessorbefehl '#include' die *.hpp
Dateien an bestimmten Stellen der 'config.cpp' eingefügt werden.
#define _ARMA_
class CfgPatches
{
class sunIsland
{
units[] = {"sunIsland"};
weapons[] = {};
requiredVersion = 1.0;
version = "11/09/2015";
fileName = "sunIsland.pbo";
author = "Schmitt";
mail = "smallfly@gmx.de";
};
};
class CfgWorlds
{
class CAWorld;
class Stratis: CAWorld
{
class Grid;
class DefaultClutter;
};
class sunIsland: Stratis
{
cutscenes[] = {};
description = "Sun Island";
worldName = "sunIsland\sunIsland.wrp";
startTime = "11:00";
startDate = "05/03/2001";
startWeather = 0.2;
startFog = 0.0;
forecastWeather = 0.6;
forecastFog = 0.0;
centerPosition[] = {2560,2560,500};
seagullPos[] = {2560,2560,500};
longitude = 65;
latitude = -34;
elevationOffset = 2000;
envTexture = "A3\Data_f\env_land_ca.tga";
minTreesInForestSquare = 2;
minRocksInRockSquare = 2;
newRoadsShape = "\sunIsland\data\roads\roads.shp";
ilsPosition[] = {1024,1024};
ilsDirection[] = {0.5075,0.08,-0.8616};
ilsTaxiIn[] = {};
ilsTaxiOff[] = {};
drawTaxiway = 0;
class SecondaryAirports {};
class Sea
{
seaTexture = "a3\data_f\seatexture_co.paa";
seaMaterial = "#water";
shoreMaterial = "#shore";
shoreFoamMaterial = "#shorefoam";
shoreWetMaterial = "#shorewet";
WaterMapScale = 20;
WaterGrid = 50;
MaxTide = 0;
MaxWave = 0;
SeaWaveXScale = "2.0/50";
SeaWaveZScale = "1.0/50";
SeaWaveHScale = 2.0;
SeaWaveXDuration = 5000;
SeaWaveZDuration = 10000;
};
class OutsideTerrain
{
satellite = "sunIsland\data\SatellitenBildUmgebung.paa";
enableTerrainSynth = 0;
class Layers
{
class Layer0
{
nopx = "sunIsland\data\gdt_grass_green_nopx.paa";
texture = "sunIsland\data\gdt_grass_green_co.paa";
};
};
};
class Grid: Grid
{
offsetX = 0;
offsetY = 5120;
class Zoom1
{
zoomMax = 0.15;
format = "XY";
formatX = "000";
formatY = "000";
stepX = 100;
stepY = -100;
};
class Zoom2
{
zoomMax = 0.85;
format = "XY";
formatX = "00";
formatY = "00";
stepX = 1000;
stepY = -1000;
};
class Zoom3
{
zoomMax = 1e+030.0;
format = "XY";
formatX = "0";
formatY = "0";
stepX = 10000;
stepY = -10000;
};
};
#include "cfgClutter.hpp"
class Names
{
#include "sunIsland.hpp"
};
};
};
class CfgWorldList
{
class sunIsland{};
};
class CfgMissions
{
class Cutscenes
{
};
};
#include "cfgSurfaces.hpp"
Im Ordner 'data' befinden sich die verschiedenen Geländetexturen im ArmA-typischen Bildformat *.paa sowie Materialspezifikationsdateien (*.rvmat)
ambient[]={0.89999998,0.89999998,0.89999998,1};
diffuse[]={0.89999998,0.89999998,0.89999998,1};
forcedDiffuse[]={0.02,0.02,0.02,1};
emmisive[]={0,0,0,0};
specular[]={0,0,0,0};
specularPower=1;
PixelShaderID="NormalMapDiffuse";
VertexShaderID="NormalMapDiffuseAlpha";
class Stage1
{
texture="sunIsland\data\gdt_grass_green_nopx.paa";
uvSource="tex";
class uvTransform
{
aside[]={10,0,0};
up[]={0,10,0};
dir[]={0,0,10};
pos[]={0,0,0};
};
};
class Stage2
{
texture="sunIsland\data\gdt_grass_green_co.paa";
uvSource="tex";
class uvTransform
{
aside[]={10,0,0};
up[]={0,10,0};
dir[]={0,0,10};
pos[]={0,0,0};
};
};
Der 'source' Ordner enthält jene Dateien, welche man im 'Terrain Builder' importieren muss, um ein Gelände zu generieren.
...
190 333 48.672153
191 333 47.831406
192 333 46.898220
193 333 45.994518
194 333 45.030376
195 333 44.010223
196 333 43.016109
197 333 42.055313
198 333 41.107517
...
Die Datei 'layers.cfg' enthält innerhalb der Klasse 'Legend' die Information, welcher RGB-Farbwert, welchem Geländetyp
entspricht.
In der Klasse 'Layers' ist wiederum definiert, welcher Geländetyp durch welches Material sichtbar und hörbar gemacht werden soll.
Die Textur, die unter 'Layers' definiert ist, ist dabei nur die Grobstruktur aus hunderten Meter Entfernung. Die tatsächliche Textur,
die man beim Darüberlaufen sehen wird, ist innerhalb der Materialdatei *.rvmat definiert.
class Layers
{
class gdt_concrete
{
texture = "sunIsland\data\gdt_concrete_mco.paa";
material= "sunIsland\data\gdt_concrete.rvmat";
};
class gdt_rock
{
texture = "sunIsland\data\gdt_rock_mco.paa";
material= "sunIsland\data\gdt_rock.rvmat";
};
class gdt_desert
{
texture = "sunIsland\data\gdt_desert_mco.paa";
material= "sunIsland\data\gdt_desert.rvmat";
};
class gdt_grass_green
{
texture = "sunIsland\data\gdt_grass_green_mco.paa";
material= "sunIsland\data\gdt_grass_green.rvmat";
};
class gdt_forest_pine
{
texture = "sunIsland\data\gdt_forest_pine_mco.paa";
material= "sunIsland\data\gdt_forest_pine.rvmat";
};
class gdt_thistle_stony
{
texture = "sunIsland\data\gdt_thistle_stony_mco.paa";
material= "sunIsland\data\gdt_thistle_stony.rvmat";
};
};
class Legend
{
picture="sunIsland\source\mapLegend.png";
class Colors
{
gdt_concrete[]={{120, 120, 120}};
gdt_rock[]={{0, 0, 0}};
gdt_desert[]={{255, 255, 0}};
gdt_grass_green[]={{0, 255, 0}, {0, 255, 60}};
gdt_forest_pine[]={{0, 150, 0}};
gdt_thistle_stony[]={{255, 150, 0}};
};
};
Im Ordner 'data' ist ein Unterordner 'roads' anzulegen:
P:\scripts\
P:\scripts\editor.sqs
In die Textdatei 'editor.sqs' schreiben wir folgenden Inhalt:
~0.1
result = buldozer_LoadNewRoads "P:/sunIsland/data/roads/";
Die erste Zeile bedeutet dabei 'Warte eine Zehntelsekunde' und sorgt dafür, dass sich das Skript nicht überschlägt beim Zu-schnell-abgearbeitet-werden.
Die zweite Zeile ist ein Aufruf der Funktion 'buldozer_LoadNewRoads'. Der Funktion wird als Parameter das Verzeichnis übergeben, in welchem unsere
'roads' Konfigurationsdateien abgelegt sind. Zur Erinnerung hier noch einmal der Inhalt des 'roads' Ordners:
class RoadTypesLibrary
{
class Road0001
{
width = 14;
mainStrTex = "a3\roads_f\roads_ae\data\surf_roadtarmac_highway_ca.paa"; // lowercase!
mainTerTex = "a3\roads_f\roads_ae\data\surf_roadtarmac_highway_end_ca.paa";
mainMat = "a3\roads_f\roads_ae\data\surf_roadtarmac_highway.rvmat";
map = "main road";
AIpathOffset= 3;
order = 3;
};
class Road0002
{
width = 10;
mainStrTex = "a3\roads_f\roads_ae\data\surf_roadtarmac_main_road_ca.paa"; // lowercase!
mainTerTex = "a3\roads_f\roads_ae\data\surf_roadtarmac_main_road_end_ca.paa";
mainMat = "a3\roads_f\roads_ae\data\surf_roadtarmac_main_road.rvmat";
map = "road";
AIpathOffset= 3;
order = 4;
};
class Road0003
{
width = 10;
mainStrTex = "a3\roads_f\roads_ae\data\surf_roaddirt_road_ca.paa"; // lowercase!
mainTerTex = "a3\roads_f\roads_ae\data\surf_roaddirt_road_end_ca.paa";
mainMat = "a3\roads_f\roads_ae\data\surf_roaddirt_road.rvmat";
map = "track";
AIpathOffset= 3;
order = 5;
};
class Road0004
{
width = 10;
mainStrTex = "a3\roads_f\roads_ae\data\surf_roadconcrete_city_road_ca.paa"; // lowercase!
mainTerTex = "a3\roads_f\roads_ae\data\surf_roadconcrete_city_road_end_ca.paa";
mainMat = "a3\roads_f\roads_ae\data\surf_roadconcrete_city_road.rvmat";
map = "track";
AIpathOffset= 3;
order = 2;
};
class Road0005
{
width = 7;
mainStrTex = "a3\roads_f\roads_ae\data\surf_roaddirt_path_ca.paa"; // lowercase!
mainTerTex = "a3\roads_f\roads_ae\data\surf_roaddirt_path_end_ca.paa";
mainMat = "a3\roads_f\roads_ae\data\surf_roaddirt_path.rvmat";
map = "track";
AIpathOffset= 2.5;
order = 6;
};
class Road0006
{
width = 10;
mainStrTex = "a3\roads_f\roads_ae\data\surf_roaddirt_trans_ca.paa"; // lowercase!
mainTerTex = "a3\roads_f\roads_ae\data\surf_roaddirt_trans_end_ca.paa";
mainMat = "a3\roads_f\roads_ae\data\surf_roaddirt_trans.rvmat";
map = "road";
AIpathOffset= 1.5;
order = 7;
};
class Road0007
{
width = 14;
mainStrTex = "a3\roads_f\Roads\data\highway_ca.paa"; // lowercase!
mainTerTex = "a3\roads_f\Roads\data\highway_end_ca.paa";
mainMat = "a3\roads_f\Roads\data\Highway.rvmat";
map = "road";
AIpathOffset= 1.5;
order = 1;
};
};
Um eine Vorschau auf die verschiedenen Straßentypen zu sehen, kann man sich die Texturen in folgendem Ordner ansehen:
P:\a3\roads_f\Roads_AE\data
Die Straßentypen 1 bis 5 habe ich hier mal für euch aufgeführt. Wobei das nur dann die Straßentypen 1 bis 5 sind, wenn
ihr die gleiche 'roadslib.cfg' verwendet wie ich (siehe oben).
P:\sunIsland\source\sunIsland_exportPolylinesAusTB.png
Und so sieht die Datei 'sunIsland_exportPolylinesAusTB.png' im Grafikprogramm aus:
D:\SteamLibrary\SteamApps\common\Arma 3\@SunIsland\
D:\SteamLibrary\SteamApps\common\Arma 3\@SunIsland\addons\
Dann können wir im Addon Builder eben dieses 'addons' Verzeichnis auswählen:
*.pac;*.paa;*.rtm;*.sqf;*.sqs;*.bikb;*.fsm;*.rvmat;*.wss;*.ogg;*.wav;
*.fxy;*.csv;*.html;*.lip;*.txt;*.bisurf;*.shp;*.shx,*.cfg,*.dbf
// Hier auf zwei Zeilen aufgeteilt; muss aber in eine Zeile,
// nämlich unter 'List of files to copy directly'
Ihr solltet nun die folgende *.pbo finden:
respawn = "BASE"; // Marker nötig mit Namen respawn_west
respawnDelay = 1; // Neustartverzögerung in Sekunden
enableDebugConsole = 2; // Debugkonsole und somit Vogelperspektive im Spiel verfügbar machen
joinUnassigned = 0; // Automatisch einem freien Slot beitreten
Startet man die Mission nun im Spiel, sieht man zunächst mal das erste Mal die Minimap der eigenen Karte.
C:\Users\master\Documents\Arma 3 - Other Profiles\Schmitt\mpmissions\Schmittys_Life.Altis
Nach dem Speichern erscheint wie gesagt ein solcher Unterordner. Und darin - nicht weiter spektakulär - eine einzige Datei namens 'mission.sqm'.
In dieser Datei wird z. B. gespeichert, welche Startpositionen die spielbaren Einheiten und die Feinde haben.
D:\SteamLibrary\SteamApps\common\Arma 3\@xCam\addons\xCam.pbo
D:\SteamLibrary\SteamApps\common\Arma 3\@xCam\addons\xCam_brg_africa.pbo
D:\SteamLibrary\SteamApps\common\Arma 3\@xCam\addons\xCam_EU.pbo
D:\SteamLibrary\SteamApps\common\Arma 3\@xCam\addons\xCam_Metal.pbo
D:\SteamLibrary\SteamApps\common\Arma 3\@xCam\addons\xcam_objects.pbo
D:\SteamLibrary\SteamApps\common\Arma 3\@xCam\addons\xcam_wood.pbo
D:\SteamLibrary\SteamApps\common\Arma 3\@xCam\addons\xCam_Woodworks.pbo
Um x-cam zu nutzen, müsst ihr ArmA3 mit angepassten Startparametern starten:
D:\SteamLibrary\SteamApps\common\Arma 3\startparams.txt
Bei mir hat die Datei folgenden Inhalt:
-nosplash
-skipIntro
-world=Altis
-mod=@Arma2NET;@SunIsland;@AllInArmaDataTerrainPack;@brg;@inidbi;@xCam;@xcam_prototype
-showScriptErrors
-host
-config=server.cfg
Damit ArmA3 weiß, dass es das Spiel mit diesen Parametern starten soll, müssen wir das wie folgt bekannt geben:
D:\SteamLibrary\SteamApps\common\Arma 3\sunIsland_testMission0815.txt
Der Inhalt dieser Textdatei könnte z. B. so aussehen:
"airport_left_f";202167.40625;2371.561035;0;0;0;1;1.93411
"hangar_f";202293.5625;2378.923828;0;0;0;1;0
"hangar_f";202337.078125;2378.590576;0;0;0;1;0
"hangar_f";202370.484375;2386.177246;0;0;0;1;0
Es handelt sich also um eine Liste von Objektnamen mit zugehörigen Koordinaten. Und das ist genau das Format, welches vom "Terrain Builder" verstanden wird.
P:\sunIsland
Der Inhalt der "sunIsland.hpp" würde bei in Summe zwei definierten Keypoints wie folgt aussehen. Es können aber beliebig viele Keypoints definiert werden.
class farosCityKp
{
name="Faros";
position[]={1456.66,3087.76};
type="NameCityCapital";
radiusA=284.77;
radiusB=268.75;
angle=0.000;
};
class schuhfabrikKp
{
name="Schuhfabrik";
position[]={821.02,3140.14};
type="Hill";
radiusA=93.31;
radiusB=88.06;
angle=0.000;
};
Bei großen Karten und vielen Keypoints, gehe ich persönlich aber sehr viel effizienter vor: Ich erstelle eine Mission auf der Karte und setze Marker
mit den Typen mil_dot, mil_triangle, mil_box, loc_Rock. Danach speichere ich die Mission ab, sodass eine *.SQM Datei entsteht. Dort lösche ich alles oberhalb und
unterhalb der Marker. Die Marker übersetze ich dann mit sog. 'regulären Ausdrücken' in der Suchen-Ersetzen-Maske von Notepad++.
Reguläre Ausdrücke um aus einer mission.sqm eine names.hpp zu generieren:
=========================================================================
1. MARKER ISOLIEREN
2. 2x Shift Tab um alle Marker linksbündig zu haben (ohne unnötige Tabstopps)
2. REGULÄRE AUSDRÜCKE ANWENDEN
Name Attribut entfernen
SUCHEN: (name=)("[A-Za-zäöüß0-9_\ \-]+";\r\n\t)
ERSETZEN: nichts
Aus Text Attribut ein Name Attribut machen
SUCHEN: (text=)("[A-Za-zäöüß0-9_\ \-]+";\r\n\t)
ERSETZEN: name=\2
Höhenwert aus Position löschen
SUCHEN: (position\[\]=\{)([0-9]+(\.[0-9]+)?,)([0-9]+(\.[0-9]+)?,)([0-9]+(\.[0-9]+)?)(\};)
ERSETZEN: \1\2\6\8
Markertypen in Keypointtypen umwandeln
SUCHEN: mil_dot
ERSETZEN: NameCity
SUCHEN: mil_triangle
ERSETZEN: Name
SUCHEN: mil_box
ERSETZEN: Name
SUCHEN: loc_Rock
ERSETZEN: Hill
Markerfarbe ersatzlos löschen
SUCHEN: \tcolorName=\"[A-Za-z0-9]+\";\r\n
ERSETZEN: nichts
Position und Name Attribute tauschen
SUCHEN: (\tposition\[\]=\{[0-9.,]+\};\r\n)(\tname="[A-Za-zäüöß0-9_\ \-]+";\r\n)
ERSETZEN: \2\1
Radius und Angle Attribute ergänzen
SUCHEN: (\ttype="[A-Za-zäüöß0-9_\ \-]+";\r\n)\}
ERSETZEN: \1\tradiusA=500.0;\r\n\tradiusB=500.0;\r\n\tangle=0.000;\r\n}
F:\QGIS Lyon
Der Inhalt des Ordners sieht wie folgt aus:
"F:\QGIS Lyon\bin\nircmd.exe" exec hide F:\QGISLY~1\bin\qgis.bat
Und so sehen die Verknüfungseinstellungen aus:
X: 672339.0
Y: 5422203.0
UTM Zone: 32
Das wird unsere linke untere Ecke der ArmA3 Karte.
Im Beispiel wollen wir eine 4096x4096 Meter große Insel erstellen, die sich folglich vom genannten Punkt aus nach Norden und Osten erstreckt.
P:\sunIsland\shapefiles
Links unten: X: 672339.0 + 0.0 = 672339.0 // Y: 5422203.0 + 0.0 = 5422203.0
Rechts unten: X: 672339.0 + 4096.0 = 676435.0 // Y: 5422203.0 + 0.0 = 5422203.0
Rechts oben: X: 672339.0 + 4096.0 = 676435.0 // Y: 5422203.0 + 4096.0 = 5426299.0
Links oben: X: 672339.0 + 0.0 = 672339.0 // Y: 5422203.0 + 4096.0 = 5426299.0
Um die Koordinaten einzugeben, nutzen wir das Knotenwerkzeug.
D:\SteamLibrary\SteamApps\common\Arma 3\@ace
Egal wie man die Mod heruntergeladen hat, am Ende findest man die ACE Dateien in folgendem Verzeichnis:
D:\SteamLibrary\SteamApps\common\Arma 3\@ace
ACE3 funktioniert nur, wenn die Community Based Addons 'CBA' installiert sind, welche sich z. B. in folgendem Verzeichnis befinden sollten:
D:\SteamLibrary\SteamApps\common\Arma 3\@CBA_A3
Bezogen auf die Standardtastenbelegung seien nun einige, wichtige ACE3 Features aufgelistet:
C:\Users\master\Documents\Arma 3 - Other Profiles\Schmitt\mpmissions
Sobald man über den Multiplayer Missionseditor in ArmA3 eine primitive Mission angelegt, solltet ihr einen gleichnamigen Missionsordner vorfinden:
C:\Users\master\Documents\Arma 3 - Other Profiles\Schmitt\mpmissions\[Schmitt]TvT128-EndlessWar.Chernarus
Der Ordner ist wie folgt strukturiert, wobei ich gleich anmerke, dass sich in der ArmA Szene verschiedenste Ordnerstrukturen durchgesetzt haben.
/*
File: cfgDebriefing.h
Autor: Thomas 'smallfly' Ludwig aka 'Schmitt'
*/
class AufDerBlackList
{
title = "Mission fehlgeschlagen";
subtitle = "Sie stehen auf der Blacklist!";
description = "Bitte wenden Sie sich an einen Supporter in Teamspeak.";
pictureBackground = "";
picture = "";
pictureColor[] = {0.5, 0.5, 0.5, 1};
};
class NichtAufDerWhitelist
{
title = "Mission fehlgeschlagen";
subtitle = "Nicht auf der White-List!";
description = "Bitte wenden Sie sich an einen Supporter in Teamspeak.";
pictureBackground = "";
picture = "";
pictureColor[] = {0.5, 0.5, 0.5, 1};
};
class UngueltigerSpielerName
{
title = "Mission fehlgeschlagen";
subtitle = "Ungültiger Spielername!";
description = "Bitte benennen Sie sich um.";
pictureBackground = "";
picture = "";
pictureColor[] = {0.5, 0.5, 0.5, 1};
};
Die "defaultStyle.h" Datei enthält Definitionen hinsichtlich Farben und Dimensionen von Benutzerdialogen. Hier mal meine "defaultStyle.h" Datei.
/*
File: defaultStyle.h
Autor: Thomas 'smallfly' Ludwig aka 'Schmitt'
*/
// https://community.bistudio.com/wiki/Dialog_Control#Constants
#define CT_STATIC 0
#define CT_BUTTON 1
#define CT_EDIT 2
#define CT_SLIDER 3
#define CT_COMBO 4
#define CT_LISTBOX 5
#define CT_TOOLBOX 6
#define CT_CHECKBOXES 7
#define CT_PROGRESS 8
#define CT_HTML 9
#define CT_STATIC_SKEW 10
#define CT_ACTIVETEXT 11
#define CT_TREE 12
#define CT_STRUCTURED_TEXT 13
#define CT_CONTEXT_MENU 14
#define CT_CONTROLS_GROUP 15
#define CT_SHORTCUTBUTTON 16
#define CT_XKEYDESC 40
#define CT_XBUTTON 41
#define CT_XLISTBOX 42
#define CT_XSLIDER 43
#define CT_XCOMBO 44
#define CT_ANIMATED_TEXTURE 45
#define CT_CHECKBOX 77
#define CT_OBJECT 80
#define CT_OBJECT_ZOOM 81
#define CT_OBJECT_CONTAINER 82
#define CT_OBJECT_CONT_ANIM 83
#define CT_LINEBREAK 98
#define CT_ANIMATED_USER 99
#define CT_MAP 100
#define CT_MAP_MAIN 101
#define CT_LISTNBOX 102
#define CT_ITEMSLOT 103
#define ST_POS 0x0F
#define ST_HPOS 0x03
#define ST_VPOS 0x0C
#define ST_LEFT 0x00
#define ST_RIGHT 0x01
#define ST_CENTER 0x02
#define ST_DOWN 0x04
#define ST_UP 0x08
#define ST_VCENTER 0x0c
#define ST_TYPE 0xF0
#define ST_SINGLE 0
#define ST_MULTI 16
#define ST_TITLE_BAR 32
#define ST_PICTURE 48
#define ST_FRAME 64
#define ST_BACKGROUND 80
#define ST_GROUP_BOX 96
#define ST_GROUP_BOX2 112
#define ST_HUD_BACKGROUND 128
#define ST_TILE_PICTURE 144
#define ST_WITH_RECT 160
#define ST_LINE 176
#define ST_SHADOW 0x100
#define ST_NO_RECT 0x200 // this style works for CT_STATIC in conjunction with ST_MULTI
#define ST_KEEP_ASPECT_RATIO 0x800
#define ST_TITLE ST_TITLE_BAR + ST_CENTER // Slider styles
#define SL_DIR 0x400
#define SL_VERT 0
#define SL_HORZ 0x400
#define SL_TEXTURES 0x10 // progress bar
#define ST_VERTICAL 0x01
#define ST_HORIZONTAL 0 // Listbox styles
#define LB_TEXTURES 0x10
#define LB_MULTI 0x20
#define FontM "Zeppelin32" // Tree styles
#define TR_SHOWROOT 1
#define TR_AUTOCOLLAPSE 2 // Message Box styles
#define MB_BUTTON_OK 1
#define MB_BUTTON_CANCEL 2
#define MB_BUTTON_USER 4
#define FARBE_HINTERGRUND {0.00, 0.00, 0.00, 0.70}
#define SCHWARZ_TRANSPARENT {0.00, 0.00, 0.00, 0.50}
#define WEISS_TRANSPARENT {1.00, 1.00, 1.00, 0.50}
#define GRAU_TRANSPARENT {0.50, 0.50, 0.50, 0.50}
#define FARBE_TRANSPARENT {0.00, 0.00, 0.00, 0.00}
#define FARBE_WEISS {1.00, 1.00, 1.00, 1.00}
#define FARBE_HELL_GRAU {0.75, 0.75, 0.75, 1.00}
#define FARBE_GRAU {0.50, 0.50, 0.50, 1.00}
#define FARBE_SCHWARZ {0.00, 0.00, 0.00, 1.00}
#define FARBE_KNALL_BLAU {0.18, 0.40, 0.77, 0.70}
class schmitt_rscEinfacherText
{
type = CT_STATIC;
style = ST_SINGLE;
x = 0;
y = 0;
h = 0.040;
w = 0.100;
shadow = 1;
text = "";
SizeEx = 0.040;
font = "PuristaMedium";
colorShadow[] = SCHWARZ_TRANSPARENT;
colorText[] = FARBE_WEISS;
colorBackground[] = FARBE_TRANSPARENT;
tooltipColorText[] = FARBE_WEISS;
tooltipColorBox[] = FARBE_WEISS;
tooltipColorShade[]= FARBE_HINTERGRUND;
};
class schmitt_rscUeberschrift : schmitt_rscEinfacherText
{
colorBackground[] = FARBE_KNALL_BLAU;
};
class schmitt_rscStrukturierterText
{
type = CT_STRUCTURED_TEXT;
style = ST_SINGLE;
x = 0;
y = 0;
h = 0.040;
w = 0.100;
size = 0.040;
text = "";
shadow= 1;
colorText[] = FARBE_WEISS;
class Attributes
{
shadow= 1;
color = "#ffffff";
align = "left";
font = "PuristaMedium";
};
};
class schmitt_rscBild
{
type = CT_STATIC;
style = ST_PICTURE;
text = "";
x = 0;
y = 0;
w = 0.100;
h = 0.100;
shadow= 0;
sizeEx= 0.040;
font = "PuristaMedium";
colorBackground[] = FARBE_TRANSPARENT;
colorText[] = FARBE_WEISS;
tooltipColorText[] = FARBE_WEISS;
tooltipColorBox[] = FARBE_WEISS;
tooltipColorShade[]= FARBE_HINTERGRUND;
};
class schmitt_rscSchaltflaeche
{
type = CT_SHORTCUTBUTTON;
style = ST_CENTER + ST_VCENTER;
idc = -1;
x = 0;
y = 0;
w = 0.100;
h = 0.040;
size = 0.040; // "possibly an irrelevant xbox dialog"
sizeEx = 0.040;
font = "PuristaMedium";
text = "";
action = "";
default = 1; // "Whether or not this button is the dialog's initially selected button"
shadow = 0;
period = 1.0;
periodFocus= 1.0;
periodOver = 1.0;
textureNoShortcut= "";
// https://community.bistudio.com/wiki/Procedural_Textures
animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)";
animTextureDisabled= "#(argb,8,8,3)color(1,1,1,1)";
animTextureOver = "#(argb,8,8,3)color(1,1,1,1)";
animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)";
animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)";
animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)";
colorBackground[] = FARBE_KNALL_BLAU;
colorBackgroundFocused[]= FARBE_WEISS;
colorBackgroundDisabled[]= FARBE_GRAU;
colorBackground2[] = FARBE_HELL_GRAU;
color[] = FARBE_WEISS;
colorFocused[] = FARBE_SCHWARZ;
color2[] = FARBE_SCHWARZ;
colorText[] = FARBE_WEISS;
colorDisabled[] = FARBE_GRAU;
tooltipColorText[] = FARBE_WEISS;
tooltipColorBox[] = FARBE_WEISS;
tooltipColorShade[] = FARBE_HINTERGRUND;
soundEnter[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEnter" ,1.00,1};
// https://community.bistudio.com/wiki/Description.ext#cfgSounds
soundPush[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundPush" ,1.00,1}; // "filename, volume, pitch"
soundClick[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundClick" ,1.00,1};
soundEscape[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",1.00,1};
class HitZone // https://community.bistudio.com/wiki/DialogControls-Buttons#TextPos.2FHitZone
{
// Die Zahlen sind als Abstände von den jeweiligen Seiten zu interpretieren
// Was in der Mitte übrig bleibt, die die HitZone, die auf Mausklicks reagiert
left = 0.0;
top = 0.0;
right = 0.0;
bottom= 0.0;
};
class TextPos // https://community.bistudio.com/wiki/DialogControls-Buttons#TextPos.2FHitZone
{
left = 0.000;
top = 0.001;
right = 0.000;
bottom= 0.001;
};
class Attributes // https://community.bistudio.com/wiki/Dialog_Control#Attributes_class
{
font = "PuristaLight";
color = "#E5E5E5";
align = "center";
shadow= 0;
};
class AttributesImage // https://community.bistudio.com/wiki/Dialog_Control#AttributesImage_class
{
font = "PuristaMedium";
color = "#E5E5E5";
align = "left";
};
class ShortcutPos // https://community.bistudio.com/wiki/DialogControls-Buttons#ShortcutPos
{
left= 0.005;
top = 0.005;
w = 0.0225;
h = 0.03;
};
};
class schmitt_rscExterneSchaltflaeche : schmitt_rscSchaltflaeche
{
// "extern" im Sinne von, die Schaltfläche ist außerhalb der halbtransparenten Dialog-Hintergrundfläche
colorBackground[] = FARBE_HINTERGRUND;
};
class schmitt_rscScrollBalken
{
scrollSpeed= 0.06;
shadow = 0;
width = 0;
height = 0;
autoScrollEnabled= 1;
autoScrollSpeed = -1;
autoScrollDelay = 5;
autoScrollRewind = 0;
thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa";
arrowEmpty= "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa";
color[] = FARBE_HELL_GRAU;
colorActive[] = FARBE_WEISS;
colorDisabled[]= FARBE_GRAU;
};
class schmitt_rscDropDownListe
{
// https://community.bistudio.com/wiki/DialogControls-Combo
type = CT_COMBO;
style = ST_MULTI;
x = 0;
y = 0;
w = 0.200;
h = 0.040;
sizeEx = 0.040; // "the font size of text (0..1)"
wholeHeight= 0.40; // "the height of the elapsed box."
font = "PuristaMedium";
shadow = 0;
maxHistoryDelay= 1.0;
arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
colorBackground[] = GRAU_TRANSPARENT;
colorSelectBackground[]= FARBE_WEISS;
colorSelect[] = FARBE_SCHWARZ;
colorText[] = FARBE_WEISS;
color[] = FARBE_WEISS;
colorActive[] = FARBE_WEISS;
colorDisabled[] = FARBE_GRAU;
soundSelect[] = {"", 1.0, 1};
soundExpand[] = {"", 1.0, 1};
soundCollapse[]= {"", 1.0, 1};
class ComboScrollBar : schmitt_rscScrollBalken {};
};
class schmitt_rscEinSpaltenListe
{
type = CT_LISTBOX;
style = ST_MULTI;
idc = -1;
x = 0;
y = 0;
w = 0.200;
h = 0.500;
sizeEx = 0.040;
rowHeight= 0.050;
font = "PuristaMedium";
arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
maxHistoryDelay = 1;
autoScrollSpeed = -1;
autoScrollDelay = 5;
autoScrollRewind= 0;
colorSelect[] = FARBE_WEISS;
colorText[] = FARBE_WEISS;
colorBackground[] = FARBE_TRANSPARENT;
colorSelect2[] = FARBE_WEISS;
colorSelectBackground[] = WEISS_TRANSPARENT;
colorSelectBackground2[]= WEISS_TRANSPARENT;
colorScrollbar[] = FARBE_GRAU;
color[] = FARBE_WEISS;
colorActive[] = FARBE_SCHWARZ;
colorDisabled[] = FARBE_GRAU;
tooltipColorText[] = FARBE_WEISS;
tooltipColorBox[] = FARBE_WEISS;
tooltipColorShade[] = SCHWARZ_TRANSPARENT;
soundSelect[] = {"", 1.0, 1};
soundExpand[] = {"", 1.0, 1};
soundCollapse[] = {"", 1.0, 1};
class ListScrollBar : schmitt_rscScrollBalken {};
};
class schmitt_rscMehrSpaltenListe
{
type = CT_LISTNBOX;
style = ST_MULTI;
sizeEx= 0.040;
font = "PuristaMedium";
shadow = 0;
period = 1.0;
maxHistoryDelay = 0.5;
autoScrollSpeed = -1;
autoScrollDelay = 5;
autoScrollRewind= 0;
color[] = FARBE_WEISS;
colorText[] = FARBE_WEISS;
colorDisabled[] = FARBE_GRAU;
colorScrollbar[] = FARBE_WEISS;
colorSelect[] = FARBE_SCHWARZ;
colorSelect2[] = FARBE_SCHWARZ;
colorSelectBackground[] = FARBE_HELL_GRAU;
colorSelectBackground2[]= WEISS_TRANSPARENT;
soundSelect[] = {"", 1.0, 1};
soundExpand[] = {"", 1.0, 1};
soundCollapse[] = {"", 1.0, 1};
class ListScrollBar : schmitt_rscScrollBalken {};
};
class schmitt_rscEingabeFeld
{
type = CT_EDIT;
style = ST_LEFT + ST_VCENTER;
font = "PuristaMedium";
shadow = 2;
sizeEx = 0.040;
autocomplete = false;
canModify = 1;
colorBackground[]= FARBE_SCHWARZ;
colorText[] = FARBE_WEISS;
colorDisabled[] = FARBE_GRAU;
colorSelection[] = FARBE_WEISS;
};
class schmitt_rscHorizontalerSchieber
{
// https://community.bistudio.com/wiki/DialogControls-Sliders
type = CT_XSLIDER;
style = SL_HORZ;
x = 0;
y = 0;
h = 0.040;
w = 0.400000;
shadow = 2;
arrowEmpty= "\A3\ui_f\data\gui\cfg\slider\arrowEmpty_ca.paa";
arrowFull = "\A3\ui_f\data\gui\cfg\slider\arrowFull_ca.paa";
border = "\A3\ui_f\data\gui\cfg\slider\border_ca.paa";
thumb = "\A3\ui_f\data\gui\cfg\slider\thumb_ca.paa";
color[] = WEISS_TRANSPARENT;
colorActive[] = FARBE_WEISS;
colorDisabled[]= FARBE_GRAU;
};
class schmitt_rscMapControl
{
// https://community.bistudio.com/wiki/Dialog_Control_Map
access = 0;
idc = 51;
type = CT_MAP_MAIN;
style = ST_PICTURE;
x = 0.10;
y = 0.10;
w = 0.80;
h = 0.60;
stickX[] = {0.2,{"Gamma",1,1.5}};
stickY[] = {0.2,{"Gamma",1,1.5}};
ptsPerSquareSea = 5;
ptsPerSquareTxt = 3;
ptsPerSquareCLn = 10;
ptsPerSquareExp = 10;
ptsPerSquareCost = 10;
ptsPerSquareFor = 9;
ptsPerSquareForEdge = 9;
ptsPerSquareRoad = 6;
ptsPerSquareObj = 9;
showCountourInterval= 0;
scaleMin = 0.001;
scaleMax = 1;
scaleDefault = 0.20;
maxSatelliteAlpha = 0.85;
alphaFadeStartScale = 0.35;
alphaFadeEndScale = 0.4;
text = "#(argb,8,8,3)color(1,1,1,1)";
moveOnEdges = 0;
shadow = 0;
font = "TahomaB";
fontLabel = "TahomaB";
fontGrid = "TahomaB";
fontUnits = "TahomaB";
fontNames = "TahomaB";
fontInfo = "TahomaB";
fontLevel = "TahomaB";
sizeEx = 0.040;
sizeExLabel= 0.040;
sizeExGrid = 0.040;
sizeExUnits= 0.040;
sizeExNames= 0.040;
sizeExInfo = 0.040;
sizeExLevel= 0.040;
colorBackground[] = FARBE_WEISS;
colorText[] = FARBE_SCHWARZ;
colorGrid[] = {0.10, 0.10, 0.10, 0.60};
colorGridMap[] = {0.10, 0.10, 0.10, 0.60};
colorSea[] = {0.45, 0.65, 0.85, 0.50};
colorForest[] = {0.60, 0.80, 0.40, 0.50};
colorRocks[] = {0.00, 0.00, 0.00, 0.30};
colorCountlines[] = {0.60, 0.35, 0.20, 0.25};
colorForestBorder[] = {0.00, 0.00, 0.00, 0.00};
colorTracks[] = {0.85, 0.75, 0.65, 0.15};
colorRocksBorder[] = {0.00, 0.00, 0.00, 0.00};
colorPowerLines[] = {0.10, 0.10, 0.10, 1.00};
colorRailWay[] = {0.80, 0.20, 0.00, 1.00};
colorMainCountlines[] = {0.60, 0.35, 0.20, 0.50};
colorCountlinesWater[] = {0.50, 0.60, 0.70, 0.30};
colorMainCountlinesWater[]= {0.50, 0.60, 0.70, 0.60};
colorNames[] = {0.10, 0.10, 0.10, 0.90};
colorMainRoads[] = {0.90, 0.50, 0.30, 1.00};
colorMainRoadsFill[] = {1.00, 0.60, 0.40, 1.00};
colorRoads[] = {0.70, 0.70, 0.70, 1.00};
colorTracksFill[] = {0.85, 0.75, 0.65, 1.00};
colorRoadsFill[] = {1.00, 1.00, 1.00, 1.00};
colorInactive[] = {1.00, 1.00, 1.00, 0.50};
colorLevels[] = {0.30, 0.20, 0.10, 0.50};
colorOutside[] = {0.00, 0.00, 0.00, 1.00};
class Legend
{
x = 0;
y = 0;
w = 1.0;
h = 1.0;
sizeEx = 0.040;
font = "PuristaMedium";
colorBackground[]= {1,1,1,0.5};
color[] = {0.00, 0.00, 0.00, 1.00};
};
class Task
{
colorFailed[] = {1.00, 0.30, 0.20, 1.00};
colorCreated[] = {1.00, 1.00, 1.00, 1.00};
colorDone[] = {0.70, 1.00, 0.30, 1.00};
colorCanceled[] = {0.70, 0.70, 0.70, 1.00};
color[] = FARBE_KNALL_BLAU;
icon = "\A3\ui_f\data\map\mapcontrol\taskIcon_CA.paa";
iconCanceled = "\A3\ui_f\data\map\mapcontrol\taskIconCanceled_CA.paa";
iconCreated = "\A3\ui_f\data\map\mapcontrol\taskIconCreated_CA.paa";
iconFailed = "\A3\ui_f\data\map\mapcontrol\taskIconFailed_CA.paa";
iconDone = "\A3\ui_f\data\map\mapcontrol\taskIconDone_CA.paa";
importance = 1;
size = 26;
coefMin = 1;
coefMax = 1;
};
class ActiveMarker
{
color[] = {0.30, 0.10, 0.90, 1.00};
size = 50;
};
class Command
{
color[] = {1.00, 1.00, 1.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\waypoint_ca.paa";
size = 18;
importance= 1;
coefMin = 1;
coefMax = 1;
};
class CustomMark
{
color[] = {0.00, 0.00, 0.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\custommark_ca.paa";
size = 24;
importance= 1;
coefMin = 1;
coefMax = 1;
};
class Tree
{
color[] = {0.45, 0.64, 0.33, 0.40};
icon = "\A3\ui_f\data\map\mapcontrol\bush_ca.paa";
size = 12;
importance= "0.9 * 16 * 0.05";
coefMin = 0.25;
coefMax = 4;
};
class SmallTree
{
color[] = {0.45,0.64,0.33,0.4};
icon = "\A3\ui_f\data\map\mapcontrol\bush_ca.paa";
size = 12;
importance= "0.6 * 12 * 0.05";
coefMin = 0.25;
coefMax = 4;
};
class Bush
{
color[] = {0.45,0.64,0.33,0.4};
icon = "\A3\ui_f\data\map\mapcontrol\bush_ca.paa";
size = "14/2";
importance= "0.2 * 14 * 0.05 * 0.05";
coefMin = 0.25;
coefMax = 4;
};
class Church
{
color[] = {1.00, 1.00, 1.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\church_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
};
class Chapel
{
color[] = {0.00, 0.00, 0.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\Chapel_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
};
class Cross
{
color[] = {0.00, 0.00, 0.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\Cross_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
};
class Rock
{
color[] = {0.1,0.1,0.1,0.8};
icon = "\A3\ui_f\data\map\mapcontrol\rock_ca.paa";
size = 12;
importance= "0.5 * 12 * 0.05";
coefMin = 0.25;
coefMax = 4;
};
class Bunker
{
color[] = {0.00, 0.00, 0.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\bunker_ca.paa";
size = 14;
importance= "1.5 * 14 * 0.05";
coefMin = 0.25;
coefMax = 4;
};
class Fortress
{
color[] = {0.00, 0.00, 0.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\bunker_ca.paa";
size = 16;
importance= "2 * 16 * 0.05";
coefMin = 0.25;
coefMax = 4;
};
class Fountain
{
color[] = {0.00, 0.00, 0.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\fountain_ca.paa";
size = 11;
importance= "1 * 12 * 0.05";
coefMin = 0.25;
coefMax = 4;
};
class ViewTower
{
color[] = {0.00, 0.00, 0.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\viewtower_ca.paa";
size = 16;
importance= "2.5 * 16 * 0.05";
coefMin = 0.5;
coefMax = 4;
};
class Lighthouse
{
color[] = {1.00, 1.00, 1.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\lighthouse_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
};
class Quay
{
color[] = {1.00, 1.00, 1.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\quay_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
};
class Fuelstation
{
color[] = {1.00, 1.00, 1.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\fuelstation_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
};
class Hospital
{
color[] = {1.00, 1.00, 1.00, 1.00};
icon = ""; // ausgeblendet
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
};
class BusStop
{
color[] = {1.00, 1.00, 1.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\busstop_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
};
class Transmitter
{
color[] = {1.00, 1.00, 1.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\transmitter_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
};
class Stack
{
color[] = {0.00, 0.00, 0.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\stack_ca.paa";
size = 20;
importance= "2 * 16 * 0.05";
coefMin = 0.9;
coefMax = 4;
};
class Ruin
{
color[] = {0.00, 0.00, 0.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\ruin_ca.paa";
size = 16;
importance= "1.2 * 16 * 0.05";
coefMin = 1;
coefMax = 4;
};
class Tourism
{
color[] = {0.00, 0.00, 0.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\tourism_ca.paa";
size = 16;
importance= "1 * 16 * 0.05";
coefMin = 0.7;
coefMax = 4;
};
class Watertower
{
color[] = {1.00, 1.00, 1.00, 1.00};
icon = "\A3\ui_f\data\map\mapcontrol\watertower_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
};
class Waypoint
{
color[] = {0.00, 0.00, 0.00, 1.00};
size = 24;
importance= 1;
coefMin = 1;
coefMax = 1;
icon = "\A3\ui_f\data\map\mapcontrol\waypoint_ca.paa";
};
class WaypointCompleted
{
color[] = {0.00, 0.00, 0.00, 1.00};
size = 24;
importance= 1;
coefMin = 1;
coefMax = 1;
icon = "\A3\ui_f\data\map\mapcontrol\waypointCompleted_ca.paa";
};
class power
{
icon = "\A3\ui_f\data\map\mapcontrol\power_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
color[] = {1.00, 1.00, 1.00, 1.00};
};
class powersolar
{
icon = "\A3\ui_f\data\map\mapcontrol\powersolar_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
color[] = {1.00, 1.00, 1.00, 1.00};
};
class powerwave
{
icon = "\A3\ui_f\data\map\mapcontrol\powerwave_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
color[] = {1.00, 1.00, 1.00, 1.00};
};
class powerwind
{
icon = "\A3\ui_f\data\map\mapcontrol\powerwind_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
color[] = {1.00, 1.00, 1.00, 1.00};
};
class shipwreck
{
icon = "\A3\ui_f\data\map\mapcontrol\shipwreck_CA.paa";
size = 24;
importance= 1;
coefMin = 0.85;
coefMax = 1;
color[] = {1.00, 1.00, 1.00, 1.00};
};
};
Die "description.ext" ist neben der "mission.sqm" wohl die zweitwichtigste Datei in jedem Missionsordner.
In der "description.ext" werden die Stammdaten der Mission definiert, sowie Dialoge, Funktionen und Sounds eingebunden.
/*
File: description.ext
Autor: Thomas 'smallfly' Ludwig aka 'Schmitt'
http://www.ludwig-software.de
Template source: https://community.bistudio.com/wiki/Description.ext
Es handelt sich um eine Endlosmission für taktische ArmA Clans/Communities.
Es gibt vier Szenarien, bei denen es jeweils gilt eine Stadt zu erobern, die vom Feind besetzt ist.
Besondere Vorsicht ist bzgl. der jeweiligen Nachbarorte zu gewährleisten.
Der Feind agiert überraschend und hinterhältig.
*/
author = "Schmitt";
onLoadName = "TvT128 - Endless War";
onLoadMission = "Public-Mission für die 3. Jägerkompanie";
loadScreen = "media\icons\endlessWar.paa";
briefing = 1;
disabledAI = 1; // "When 1, removes all playable units which do not have a human player."
disableChannels[] = {0,2,6};// 0 = Global, 1 = Side, 2 = Command, 6 = System
joinUnassigned = 1; // "auto assigned to the side with least players"
respawn = "BASE"; // Marker nötig mit Namen respawn_west, respawn_east, respawn_guerrila, respawn_civilian
respawnDelay = 5; // Neustartverzögerung in Sekunden
enableDebugConsole = 2; // '1' bedeutet, dass die Konsole nur offline zur Verfügung steht, bzw. online für eingewählte Admins
respawnDialog = 1; // '0' damit keine Punkteauswertung nach dem Tod erscheint
wreckLimit = 5; // "Vehicle wreck limit before which ( <= ) wreckRemovalMaxTime
// applies and after which ( > ) wreckRemovalMinTime applies"
wreckRemovalMinTime = 300; // "Remove all wrecks that have existed longer than wreckRemovalMinTime when wreckLimit is breached"
wreckRemovalMaxTime = 900; // "Maximum time a wreck can remain on the ground if total number of wrecks is equal or under wreckLimit."
corpseLimit = 15; // "Corpse limit before which ( <= ) corpseRemovalMaxTime applies and after which ( > ) corpseRemovalMinTime applies"
corpseRemovalMinTime = 300; // "Remove all bodies that have been dead longer than corpseRemovalMinTime when corpseLimit is breached."
corpseRemovalMaxTime = 900; // "Maximum time a corpse can remain on the ground if total number of corpses is equal or under corpseLimit."
corpseManagerMode = 3; // 3 = All_But_Respawned - All units are managed by the manager with exception of respawned (opposite to mode 2) Default value: 0 for SP, 2 for MP
wreckManagerMode = 3; // 3 = All_But_Respawned - All vehicles are managed by the manager with exception of respawned (opposite to mode 2) Default value: 0 for SP, 2 for MP
ShowCompass =1;
ShowMap =1;
ShowNotePad =1;
ShowWatch =1;
ShowDebriefing=1;
ShowGps =1;
class Header
{
gameType = Coop;
minPlayers = 1;
maxPlayers = 128;
};
// === DIALOGE (mit Maussteuerung) ===
#include "defaultStyle.h"
#include "taw_vd\dialog.hpp"
#include "functions\020_neuesLeben\TodesBildschirmDialog.h"
#include "functions\310_startpunktAuswahlDialog\StartpunktAuswahlDialog.h"
#include "functions\330_adminDialog\AdminDialog.h"
// === ANZEIGEN (ohne Maussteuerung) ===
class RscTitles
{
#include "functions\305_statusAnzeige\StatusAnzeige.h"
#include "functions\307_fortschrittAnzeige\FortschrittAnzeige.h"
};
class CfgFunctions
{
#include "functions\cfgFunctions.h"
#include "taw_vd\CfgFunctions.hpp"
};
class CfgSounds
{
sounds[] = {};
#include "media\sounds\effekte\soundDefinitionen.h"
#include "media\sounds\sirenen\soundDefinitionen.h"
#include "media\sounds\musik\soundDefinitionen.h"
#include "media\sounds\durchsagen\soundDefinitionen.h"
};
class CfgDebriefing
{
#include "cfgDebriefing.h"
};
class DefaultEventhandlers;
Die "init.sqf" ist das erste Skript, das ausgeführt wird, wenn man auf einen Server connected und die erste Datei, die vom Server genau einmal ausgeführt wird, wenn der Server
startet. Wobei diese Aussage nicht 100% richtig ist. Welche Spezialfunktionen noch vorher ausgeführt werden, kann man dem Kommentar in nachfolgendem Skript entnehmen.
/*
File: init.sqf
Autor: Thomas 'smallfly' Ludwig aka 'Schmitt'
Description:
"Executed when mission is started (before briefing screen)", https://community.bistudio.com/wiki/Event_Scripts
Initialization Order: When mission is starting, its components are initialized in the following order:
- 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
Die init.sqf wird also jeweils beim Server UND beim Client ausgeführt.
*/
Private ["_waffenKisten_blu", "_fahrzeugKisten", "_fahrzeugKisten_red", "_action", "_heliKisten", "_heliKisten_red"];
enableSaving [false, false]; // Speichern deaktiviert; keine Auto-Sicherung
["'init.sqf' wartet auf Abarbeitung der 'initPlayerLocal.sqf' ..."] call schmitt_fnc_statusBerichten;
waitUntil { !isNil "schmitt_initPlayerLocal" };
["Abarbeitung der 'initPlayerLocal.sqf' ist erfolgt, starte 'init.sqf' ..."] call schmitt_fnc_statusBerichten;
diag_log "";
diag_log "/==============\";
diag_log "| INIT.SQF |";
diag_log "\==============/";
diag_log "";
[] spawn schmitt_fnc_initialisiereClientUndServerThirdpartySkripte;
[] spawn schmitt_fnc_starteAktualisierungServerInfo;
//cutText ["","BLACK IN", 1];
introKamera cameraEffect ["TERMINATE","BACK"]; camDestroy introKamera; // INTRO KAMERA BEENDEN
_action = recyclingKiste addAction ["Atomwaffen-Bausatz verschrotten", { ["recyclingAnlieferpunkt"] spawn schmitt_fnc_kisteVerschrotten; }];
// === An Waffenkisten soll man sich ausrüsten können ===
_waffenKisten_blu = [waffenKiste_blu1, waffenKiste_blu2, waffenKiste_blu3];
{
// Normales Infantrie-Squad
_action = _x addAction ["Ausrüstung #1 Gruppenführer", { [_this select 1, "gruppenfuehrer"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #2 Stellv. Gruppenführer", { [_this select 1, "gruppenfuehrer"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #3 MG-Schütze", { [_this select 1, "mgSchuetze"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #4 Erste Panzerfaust", { [_this select 1, "panzerAbwehr"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #5 MG-Hilfsschütze", { [_this select 1, "mgHilfsschuetze"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #6 Zweite Panzerfaust", { [_this select 1, "panzerAbwehr"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #7 Sanitäter", { [_this select 1, "sanitaeter"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #8 Grenadier", { [_this select 1, "grenadier"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #9 Luftabwehr", { [_this select 1, "luftAbwehr"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #10 Pionier", { [_this select 1, "pionier"] spawn schmitt_fnc_spielerAusruesten; }];
// Sonderklassen
_action = _x addAction ["Ausrüstung #A Gruppenscharfschütze", { [_this select 1, "gruppenscharfschuetze"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #B Scharfschütze", { [_this select 1, "scharfschuetze"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #C Spotter", { [_this select 1, "spotter"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #D Pilot", { [_this select 1, "pilot"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #E Crew", { [_this select 1, "crew"] spawn schmitt_fnc_spielerAusruesten; }];
_action = _x addAction ["Ausrüstung #F UAV-Operator", { [_this select 1, "uavOperator"] spawn schmitt_fnc_spielerAusruesten; }];
}
forEach _waffenKisten_blu;
_fahrzeugKisten = [fahrzeugKiste];
{
_action = _x addAction ["Funktionsfahrzeug Dingo MG", { ["fahrzeugSpawn_blu", "bw_dingo_wdl"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Transporter HEMTT", { ["fahrzeugSpawn_blu", "B_Truck_01_transport_F"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Schützenpanzer Puma", { ["fahrzeugSpawn_blu", "BWA3_Puma_Fleck"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Kampfpanzer Leopard", { ["fahrzeugSpawn_blu", "BWA3_Leopard2A6M_Fleck"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["LGS Fennek HMG", { ["fahrzeugSpawn_blu", "I_MRAP_03_hmg_F"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
}
forEach _fahrzeugKisten;
_fahrzeugKisten_red = [fahrzeugKiste_red];
{
_action = _x addAction ["Funktionsfahrzeug BTR-60PB", { ["fahrzeugSpawn_red", "rhs_btr60_vdv"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Transporter GAZ", { ["fahrzeugSpawn_red", "rhs_gaz66o_vdv"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Schützenpanzer BMP-1", { ["fahrzeugSpawn_red", "rhs_bmp1_vdv"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Kampfpanzer 2S25", { ["fahrzeugSpawn_red", "rhs_sprut_vdv"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["LGS Fennek HMG", { ["fahrzeugSpawn_red", "I_MRAP_03_hmg_F"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
}
forEach _fahrzeugKisten_red;
_action = fahrzeugKiste_shuttle1 addAction ["Shuttle GLT Offroad", { ["fahrzeugSpawn_shuttle1", "GLT_Offroad"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = fahrzeugKiste_shuttle2 addAction ["Shuttle GLT Offroad", { ["fahrzeugSpawn_shuttle2", "GLT_Offroad"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = fahrzeugKiste_shuttle3 addAction ["Shuttle GLT Offroad", { ["fahrzeugSpawn_shuttle3", "GLT_Offroad"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = fahrzeugKiste_shuttle7 addAction ["Shuttle UAZ (offen)", { ["fahrzeugSpawn_shuttle7", "rhs_uaz_open_vdv"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = fahrzeugKiste_shuttle8 addAction ["Shuttle UAZ (offen)", { ["fahrzeugSpawn_shuttle8", "rhs_uaz_open_vdv"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_heliKisten = [heliKiste_blu];
{
_action = _x addAction ["Helikopter AH-9 (Raketen)", { ["heliSpawn_blu", "GLT_AH9_PMC"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Helikopter MH-9 (unbewaffnet)", { ["heliSpawn_blu", "GLT_MH9_PMC"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Helikopter Ka-60", { ["heliSpawn_blu", "GLT_KA60_PMC"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Helikopter Merlin HC-3", { ["heliSpawn_blu", "GLT_Merlin_PMC"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
}
forEach _heliKisten;
_heliKisten_red = [heliKiste_red];
{
_action = _x addAction ["Helikopter AH-9 (Raketen)", { ["heliSpawn_red", "GLT_AH9_PMC"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Helikopter MH-9 (unbewaffnet)", { ["heliSpawn_red", "GLT_MH9_PMC"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Helikopter Ka-60", { ["heliSpawn_red", "GLT_KA60_PMC"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
_action = _x addAction ["Helikopter Merlin HC-3", { ["heliSpawn_red", "GLT_Merlin_PMC"] spawn schmitt_fnc_neuesFahrzeugPlatzieren; }];
}
forEach _heliKisten_red;
// Starte Feindszenario
_action = missionControlKiste addAction ["Beende aktuelles Szenario" , {[-1] spawn schmitt_fnc_starteNeuesFeindszenarioTeil1;}];
_action = missionControlKiste addAction ["Starte Szenario 'Stary Sobor'", {[0] spawn schmitt_fnc_starteNeuesFeindszenarioTeil1;}];
_action = missionControlKiste addAction ["Starte Szenario 'Berezino'" , {[1] spawn schmitt_fnc_starteNeuesFeindszenarioTeil1;}];
_action = missionControlKiste addAction ["Starte Szenario 'Zelenogorsk'", {[2] spawn schmitt_fnc_starteNeuesFeindszenarioTeil1;}];
/*
tf_same_sw_frequencies_for_side = true;
tf_same_lr_frequencies_for_side = true;
tf_freq_west = 40;
tf_freq_east = 50;
tf_freq_west_lr = 60;
tf_freq_east_lr = 70;
*/
TF_give_microdagr_to_soldier = true; // Navipad ausgeben
Zumindest clientseitig wird kurz vor der "init.sqf" automatisch noch ein anderes Skript ausgeführt namens "initPlayerLocal.sqf".
/*
File: initPlayerLocal.sqf
Autor: Thomas 'smallfly' Ludwig aka 'Schmitt'
"Executed locally when player joins mission (includes both mission start and JIP)"
https://community.bistudio.com/wiki/Event_Scripts
*/
waitUntil { !isNil "schmitt_server_gestartet" };
["Verbindung wird aufgebaut ..."] call schmitt_fnc_statusBerichten;
diag_log "";
diag_log "/=========================\";
diag_log "| INITPLAYERLOCAL.SQF |";
diag_log "\=========================/";
diag_log "";
schmitt_mission_root = call {
private ["_arr"];
_arr = toArray str missionConfigFile;
_arr resize (count _arr - 15);
toString _arr
}; // source: http://killzonekid.com/arma-scripting-tutorials-mission-root/
_handle = [] execVM "thirdparty\KRON_Strings\KRON_Strings.sqf";
// Stringmanipulation durch dieses externe Modul ermöglichen
waitUntil {scriptDone _handle};
diag_log "Warte darauf, dass Spielerobjekt seitens ArmA-Engine erkannt wird ...";
waitUntil {!isNull player};
// "(isNull player) is true for JIP players on their client during initialization",
// https://community.bistudio.com/wiki/player
diag_log "Warte darauf, dass primäre Anzeige bereit ist ...";
waitUntil {!(isNull (findDisplay 46))};
[] call schmitt_fnc_initialisiereClientEventHandler;
// ohne diese Eventhandler kann keine Client-Server-Kommunikation stattfinden
[] call schmitt_fnc_initialisiereGlobaleKonstanten;
[] call schmitt_fnc_initialisiereClientVariablen;
_handle = [] spawn schmitt_fnc_initialisiereSpieler;
["Warte auf Spielerinitialisierung ..."] call schmitt_fnc_statusBerichten;
waitUntil {scriptDone _handle};
[] spawn schmitt_fnc_starteAktualisierungStatusAnzeige;
[] spawn schmitt_fnc_clientTaktgeberStarten;
[] spawn schmitt_fnc_meldungenAnzeigen;
[] spawn schmitt_fnc_zeigeWillkommensNachrichten;
[] spawn schmitt_fnc_gegnerAufKarteMarkieren;
[] spawn schmitt_fnc_debugMarkerLoeschen;
switch (side player) do
{
case WEST: // BLUFOR briefing goes here
{
player createDiaryRecord ["Diary", ["Lageinformationen",
"Der Feind ist im Besitz von Bausätzen, aus denen sich Atomwaffen herstellen lassen,
und lagert diese in diversen Städten im Einsatzgebiet.
Finden Sie die Bausätze und bringen Sie diese zur Entsorgung in die Basis.
Bereits das Sicherstellen einer Kiste macht den gesamten Bausatz für den Feind unbrauchbar."]];
};
case EAST:
{
player createDiaryRecord ["Diary", ["Lageinformationen",
"Sie sind im Besitz mehrerer Bausätze, aus denen sich Atomwaffen herstellen lassen und lagern
diese in diversen Städten im Einsatzgebiet.
Verteidigen Sie die Kisten und verhindern Sie deren Abtransport in die Gegnerbasis!
Bereits eine fehlende Kiste macht einen Bausatz unbrauchbar."]];
};
};
schmitt_initPlayerLocal = true;
Serverseitig hingegen wird kurz vor Aufruf der "init.sqf" automatisch das Skript "initServer.sqf" ausgeführt:
/*
File: initServer.sqf
Author: Schmitt
Description:
"Executed only on server when mission is started.", https://community.bistudio.com/wiki/Event_Scripts
*/
Private ["_handle"];
diag_log "";
diag_log "/====================\";
diag_log "| INITSERVER.SQF |";
diag_log "\====================/";
diag_log "";
if (!isDedicated) then {
["NON-DEDICATED SERVER: Spielerbewegung einfrieren bis Startpunktentscheidung ..."] call schmitt_fnc_statusBerichten;
player enableSimulation false;
};
_handle = [] execVM "thirdparty\KRON_Strings\KRON_Strings.sqf";
waitUntil {scriptDone _handle};
[] call schmitt_fnc_initialisiereGlobaleKonstanten;
[] call schmitt_fnc_initialisiereServerVariablen;
[] call schmitt_fnc_initialisiereServerEventHandler;
[] spawn schmitt_fnc_serverTaktgeberStarten;
[] spawn schmitt_fnc_zufaelligeTageszeitSetzen;
West setFriend [East, 0];
East setFriend [West, 0];
[] spawn schmitt_fnc_szenarioFeindeAuffuellen;
["Server wurde erfolgreich hochgefahren!"] call schmitt_fnc_statusBerichten;
schmitt_server_gestartet = true;
publicVariable "schmitt_server_gestartet";
Die Datei "LizenzInfo.txt" ist beliebig benannt und bietet Raum für deine Lizenzanmerkungen zur eigenen Mission, sowie zu Anmerkungen zur Verwendung fremder
Skripte und Media-Dateien in deiner Mission.
/*
File: onPlayerRespawn.sqf
Autor: Thomas 'smallfly' Ludwig aka 'Schmitt'
*/
player setVariable ["AGM_Name", name player, true]; // Workaround, da AGM derzeit nicht freiwillig die Namen über den Köpfen anzeigt, sondern "Unbekannt"
player setPos respawn_west;
Der Order "_WIP" steht für "work in progress" und enthält unfertige Skripte, die noch nicht eingebunden werden, weil sie eben unfertig sind.
/*
File: cfgFunctions.h
Autor: Thomas 'smallfly' Ludwig aka 'Schmitt'
*/
class Schmitt
{
tag = "schmitt";
// ==================
// === MANAGEMENT ===
// ==================
class taktisches_arma
{
file = "functions\005_taktischesArma";
class initialisiereTaktischeKonstanten {};
class szenarioFeindeAuffuellen {};
class starteAktualisierungServerInfo {};
class starteNeuesFeindszenarioTeil1 {};
class starteNeuesFeindszenarioTeil2 {};
class starteNeuesFeindszenarioTeil3 {};
class zufallPosInUmgebung {};
class einerGruppeWegpunkteZuordnen {};
class gegnerFahrzeugBemannen {};
class standardGegnerInfSquadSpawnen {};
class statischeGegnerWaffeSpawnen {};
class eigeneEinheitenNaheGegnerSpawn {};
class gegnerAufKarteMarkieren {};
class debugMarkerLoeschen {};
class neuesFahrzeugPlatzieren {};
class kisteVerschrotten {};
class spielerAusruesten {};
class musikAbspielen {};
};
class missionsbeginn_client
{
file = "functions\010_missionsbeginn\client";
class clientTaktgeberStarten {};
class initialisiereClientEventHandler {};
class initialisiereClientVariablen {};
class zeigeWillkommensNachrichten {};
};
class missionsbeginn_global
{
file = "functions\010_missionsbeginn\global";
class initialisiereGlobaleKonstanten {};
class initialisiereMarker {};
};
class missionsbeginn_server
{
file = "functions\010_missionsbeginn\server";
class datumUndUhrzeitVerteilen {};
class initialisiereServerEventHandler {};
class initialisiereServerVariablen {};
class schrankenAutomatischSchliessen {};
class serverTaktgeberStarten {};
};
class allgemeines
{
file = "functions\030_allgemeines";
class lokalenFlaechenMarkerErstellen {};
class lokalenPunktMarkerErstellen {};
class mpPaketAusfuehren {};
class mpPaketSenden {};
class objektSoundAbspielen {};
};
};
Wenn wir einen Blick in einen der "functions" Unterordner werfen, sehen wir dort eine Reihe von SQF-Dateien, also Skriptdateien.
/*
File: fn_starteAktualisierungServerInfo.sqf
Autor: Thomas 'smallfly' Ludwig aka 'Schmitt'
Hier werden laufend Feinde gezählt.
*/
Private [
"_pauseProIntervallInSek",
"_gesamt", "_anzahlBluforSpieler", "_anzahlOpfor", "_anzahlOpforSpieler",
"_anzahlInfanterie", "_anzahlPanzerfaust", "_anzahlSonstigeInf",
"_anzahlFahrzeuge", "_anzahlPanzer", "_anzahlStrassenFzg",
"_anzahlLuftFzg", "_anzahlMoerser", "_anzahlJeep",
"_anzahlNaheCenter", "_centerMarker",
"_stdEinheitenInGegnerSquad", "_centerPos"
];
["Initialisiere Aktualisierung Serverinfo ..."] call schmitt_fnc_statusBerichten;
_pauseProIntervallInSek = 0.5;
while {true} do
{
_gesamt = count allUnits;
_anzahlBluforSpieler = {side _x == west} count playableUnits;
_anzahlOpfor = {side _x == east} count allUnits;
_anzahlOpforSpieler = {side _x == east} count playableUnits;
_anzahlInfanterie = {side _x == east && vehicle _x == _x} count allUnits;
_anzahlPanzerfaust = 0;
_anzahlSonstigeInf = _anzahlInfanterie - _anzahlPanzerfaust;
_anzahlFahrzeuge = {
side _x == east
&& vehicle _x != _x && alive (driver _x)
} count allUnits;
_anzahlPanzer = {
side _x == east
&& (vehicle _x != _x)
&& (_x == driver (vehicle _x))
&& ((vehicle _x) isKindOf "Tank")
} count allUnits;
_anzahlStrassenFzg = {
side _x == east
&& (vehicle _x != _x)
&& (_x == driver (vehicle _x))
&& ((vehicle _x) isKindOf "LandVehicle")
} count allUnits;
_anzahlLuftFzg = {
side _x == east
&& (vehicle _x != _x)
&& (_x == driver (vehicle _x))
&& ((vehicle _x) isKindOf "Air")
} count allUnits;
_anzahlMoerser = {
side _x == east
&& (vehicle _x != _x)
&& ((vehicle _x) isKindOf "O_Mortar_01_F")
} count allUnits;
_anzahlJeep = {
side _x == east
&& (vehicle _x != _x)
&& (_x == driver (vehicle _x))
&& ((vehicle _x) isKindOf SCHMITT_REDFOR_JEEP_KLASSE)
} count allUnits;
if (schmitt_aktuellesSzenario != -1) then
{
_centerMarker = ((schmitt_szenarioOrte select schmitt_aktuellesSzenario) select SPALTE_SZENARIOORTE_CENTERSPAWN)
select SPALTE_SZENARIOORTE_MARKERNAME;
_centerPos = getMarkerPos _centerMarker;
_anzahlNaheCenter = {(side _x == east) && (_x distance _centerPos) < SCHMITT_RADIUS_CENTER} count allUnits;
} else {
_anzahlNaheCenter = 0;
};
// === BEI CLIENTS IM DEBUG MODUS DIE ANZAHL DER FEINDE ANZEIGEN ===
if (!isDedicated) then
{
schmitt_serverInfo =
[
// Seite 1
[
["Szenario", [
format ["Szenario '%1'", schmitt_aktuellesSzenario],
format ["%1 Feinde", _anzahlOpfor],
format ["%1 im Kerngebiet", _anzahlNaheCenter],
format ["%1 Kisten geb.", schmitt_geborgeneMissionsKisten]
]],
["Gesamt", [
format ["%1 Deutsche", _anzahlBluforSpieler],
format ["%1/%2 Russen AI", _anzahlOpfor, SCHMITT_MINIMUM_FEINDE],
format ["%1 Russenspieler", _anzahlOpforSpieler]
]],
["Infanterie", [
format ["%1 insgesamt", _anzahlInfanterie],
format ["%1 Pzf", _anzahlPanzerfaust],
format ["%1 Schützen", _anzahlSonstigeInf]
]],
["Fahrzeuge", [
format ["%1 insgesamt", _anzahlFahrzeuge],
format ["%1/%2 Panzer", _anzahlPanzer, SCHMITT_MAX_GEGNER_PANZER],
format ["%1 Strassenfzg", _anzahlStrassenFzg],
format ["%1/%2 Jeeps", _anzahlJeep, SCHMITT_MAX_GEGNER_JEEP],
format ["%1/%2 Luftfahrzeuge", _anzahlLuftFzg, SCHMITT_MAX_GEGNER_HELIS],
format ["%1/%2 Mörser", _anzahlMoerser, SCHMITT_MAX_MOERSER_STELLUNGEN]
]]
]
];
};
sleep _pauseProIntervallInSek;
};
Von großem Interesse dürfte auch die Funktion "fn_spielerAusruesten.sqf" sein, welche in meinem Fall auf die "BW Mod" (Bundenwehr Mod) und die Mod "ACE3" abgestimmt ist:
/*
File: fn_spielerAusruesten.sqf
Autor: Thomas 'smallfly' Ludwig aka 'Schmitt'
*/
if (isDedicated) exitWith { diag_log "FEHLER: 'fn_spielerAusruesten.sqf' lässt sich nur clientseitig ausführen!"; };
Private [
"_anbieter", "_aufrufer", "_actionId",
"_ausruestungTyp", "_typLesbar",
"_uniform", "_vest", "_backpack", "_headgear", "_googles",
"_weapons", "_stdWeapons",
"_linkItems", "_stdLinkItems", "_itemsToBackpack", "_stdItemsToBackpack",
"_acePackSuccess",
"_handMagazine", "_mediSetEinfach", "_handGranaten",
"_diverseSmokeGranaten",
"_itemsToUniform", "_stdItemsToUniform",
"_itemsToVest", "_stdItemsToVest",
"_primaryWeaponItems", "_stdPrimaryWeaponItems",
"_handgunItems", "_stdHandgunItems"
];
_aufrufer = [_this,0,objNull,[objNull]] call BIS_fnc_param;
_ausruestungTyp = [_this,1,"",[""]] call BIS_fnc_param;
systemChat format ["_ausruestungTyp: %1", _ausruestungTyp];
// === VARIABLEN INITIALISIEREN ===
_typLesbar = "";
_weapons = [];
_primaryWeaponItems = [];
_handgunItems = [];
_linkItems = [];
_itemsToUniform = [];
_itemsToVest = [];
_itemsToBackpack = [];
// === SPIELER AUSZIEHEN UND VOLLSTÄNDIG LEEREN ===
removeAllWeapons _aufrufer;
removeAllItems _aufrufer;
removeAllAssignedItems _aufrufer;
removeUniform _aufrufer;
removeVest _aufrufer;
removeBackpack _aufrufer;
removeHeadgear _aufrufer;
removeGoggles _aufrufer;
// {_aufrufer removeMagazine _x} forEach magazines _aufrufer;
_aufrufer setVariable ["cse_medicClass", 0, true]; // Festlegen ob Spieler Sani-Fähigkeiten hat
_aufrufer setVariable ["AGM_IsEOD", false, true]; // Festlegen ob Spieler Explosive Ordnance Disposal Möglichkeiten hat
// === STANDARD AUSRÜSTUNG VORBELEGEN ===
_uniform = "bw_klamotte_fleck";
_vest = "GLT_Vest_Flecktarn";
_backpack = "BW_BACKPACK2_FLECK";
_headgear = "GLT_Helmet_Light_Flecktarn";
_googles = "G_mas_wpn_bala_mask";
// === WAFFEN, AUFSÄTZE, TOOLS ===
_stdWeapons = [
"BWA3_P8",
"AGM_Vector"
];
_stdPrimaryWeaponItems = [
"BWA3_acc_LLM01_flash"
];
_stdHandgunItems = [
"BWA3_acc_LLM01_irlaser"
];
_stdLinkItems = [
"ItemMap",
"ItemCompass",
"ItemWatch",
"tf_anprc152",
"BWA3_ItemNaviPad",
"AGM_NVG_Wide"
//"ItemcTab"
];
// === UNIFORM ===
_diverseSmokeGranaten = [
"SmokeShell",
"SmokeShell",
"SmokeShellGreen",
"SmokeShellRed",
"Chemlight_green",
"Chemlight_green",
"Chemlight_green",
"Chemlight_green"
];
_stdItemsToUniform = _diverseSmokeGranaten + [
"AGM_EarBuds",
"AGM_MapTools",
"AGM_IR_Strobe_Item",
"AGM_CableTie",
"AGM_CableTie",
"AGM_CableTie",
"AGM_CableTie",
"BW_Facepaint"
];
// === WESTE ===
_mediSetEinfach = [
"cse_tourniquet",
"cse_tourniquet",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_saline_iv",
"cse_saline_iv",
"cse_morphine",
"cse_morphine",
"cse_epinephrine",
"cse_epinephrine",
"cse_epinephrine",
"cse_epinephrine"
//"cse_atropine",
//"cse_atropine",
//"cse_bandageElastic",
//"cse_bandageElastic"
];
_handMagazine = [
"BWA3_15Rnd_9x19_P8", // Magazin für Pistole
"BWA3_15Rnd_9x19_P8"
];
_stdItemsToVest = _handMagazine + [] + _mediSetEinfach;
// === RUCKSACk ===
_handGranaten = [
"BWA3_DM51A1", // Splittergranate
// "BWA3_DM25", // Rauchgranate
"AGM_M84", // Blendgranate
"AGM_HandFlare_White",
"AGM_HandFlare_White",
"AGM_HandFlare_Red",
"AGM_HandFlare_Green"
];
_stdItemsToBackpack = [
// "BWA3_Beret_Jaeger",
"BWA3_optic_NSV600"
] + _handGranaten;
switch (_ausruestungTyp) do
{
// === NORMALE INFANTRIEKLASSEN ===
case "gruppenfuehrer" :
{
// === STAMMDATEN ===
_typLesbar = "#1/#2 Gruppenführer";
_backpack = "tf_rt1523g_big_bwmod";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = _stdItemsToVest + [
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_Tracer",
"BWA3_20Rnd_762x51_G28_Tracer"
];
_itemsToBackpack = _stdItemsToBackpack + [
"Laserbatteries",
"UGL_FlareWhite_F",
"UGL_FlareGreen_F",
"UGL_FlareRed_F",
"1Rnd_Smoke_Grenade_shell",
"1Rnd_Smoke_Grenade_shell",
"1Rnd_SmokeGreen_Grenade_shell",
"1Rnd_SmokeGreen_Grenade_shell",
"1Rnd_SmokeRed_Grenade_shell",
"1Rnd_SmokeRed_Grenade_shell"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"BWA3_G27_AG",
"Laserdesignator"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_ZO4x30"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [];
};
case "mgSchuetze" :
{
// === STAMMDATEN ===
_typLesbar = "#3 MG-Schütze";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
"BWA3_120Rnd_762x51",
"BWA3_120Rnd_762x51",
"BWA3_120Rnd_762x51",
"BWA3_120Rnd_762x51",
"BWA3_120Rnd_762x51"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"BWA3_MG5"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_ZO4x30"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [];
};
case "panzerAbwehr" :
{
// === STAMMDATEN ===
_typLesbar = "#4/#6 Panzerfaust";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_Tracer",
"BWA3_20Rnd_762x51_G28_Tracer"
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
"BWA3_optic_NSA80",
"BWA3_Pzf3_IT"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"BWA3_G27",
"BWA3_Pzf3"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_ZO4x30"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [];
};
case "mgHilfsschuetze" :
{
// === STAMMDATEN ===
_typLesbar = "#5 MG-Hilfsschütze";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_Tracer",
"BWA3_20Rnd_762x51_G28_Tracer"
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
"BWA3_120Rnd_762x51",
"BWA3_120Rnd_762x51",
"BWA3_120Rnd_762x51"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"BWA3_G27"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_ZO4x30"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [];
};
case "sanitaeter" :
{
// === STAMMDATEN ===
_typLesbar = "#7 Sanitäter";
_backpack = "BW_BACKPACK2_SAN_FLECK";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_Tracer",
"BWA3_20Rnd_762x51_G28_Tracer"
] + _stdItemsToVest;
_itemsToBackpack = _itemsToBackpack - _handGranaten;
_itemsToBackpack = _stdItemsToBackpack + [
"cse_surgical_kit",
"cse_personal_aid_kit",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_bandage_basic",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_packing_bandage",
"cse_saline_iv",
"cse_saline_iv",
"cse_saline_iv",
"cse_saline_iv",
"cse_saline_iv",
"cse_saline_iv",
"cse_morphine",
"cse_morphine",
"cse_morphine",
"cse_morphine",
"cse_morphine",
"cse_morphine",
"cse_epinephrine",
"cse_epinephrine",
"cse_epinephrine",
"cse_epinephrine",
"cse_epinephrine",
"cse_epinephrine",
"cse_atropine",
"cse_atropine",
"cse_bandageElastic",
"cse_bandageElastic",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_Tracer",
"BWA3_20Rnd_762x51_G28_Tracer"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"BWA3_G27"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_ZO4x30"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [];
_aufrufer setVariable ["cse_medicClass", 1, true]; // Festlegen ob Spieler Sani-Fähigkeiten hat
};
case "grenadier" :
{
// === STAMMDATEN ===
_typLesbar = "#8 Grenadier";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_Tracer",
"BWA3_20Rnd_762x51_G28_Tracer",
"UGL_FlareWhite_F",
"UGL_FlareWhite_F",
"UGL_FlareGreen_F",
"UGL_FlareGreen_F",
"UGL_FlareRed_F",
"UGL_FlareRed_F",
"1Rnd_Smoke_Grenade_shell",
"1Rnd_Smoke_Grenade_shell",
"1Rnd_Smoke_Grenade_shell",
"1Rnd_Smoke_Grenade_shell",
"1Rnd_Smoke_Grenade_shell",
"1Rnd_SmokeGreen_Grenade_shell",
"1Rnd_SmokeGreen_Grenade_shell",
"1Rnd_SmokeRed_Grenade_shell",
"1Rnd_SmokeRed_Grenade_shell"
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell",
"1Rnd_HE_Grenade_shell"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"BWA3_G27_AG"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_ZO4x30"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [];
};
case "luftAbwehr" :
{
// === STAMMDATEN ===
_typLesbar = "#9 Luftabwehr";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_AP",
"BWA3_20Rnd_762x51_G28_Tracer",
"BWA3_20Rnd_762x51_G28_Tracer"
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
"BWA3_optic_NSA80"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"BWA3_G27",
"BWA3_RGW90_Loaded"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_ZO4x30"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [];
};
case "pionier" :
{
// === STAMMDATEN ===
_typLesbar = "#10 Pionier";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"BWA3_20Rnd_762x51_G28_Tracer",
"BWA3_20Rnd_762x51_G28_Tracer",
"BWA3_20Rnd_762x51_G28_Tracer",
"BWA3_20Rnd_762x51_G28_Tracer"
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
"AGM_Clacker",
"AGM_M26_Clacker",
"AGM_DefusalKit",
"SLAMDirectionalMine_Wire_Mag",
"ClaymoreDirectionalMine_Remote_Mag",
"DemoCharge_Remote_Mag",
"DemoCharge_Remote_Mag"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"BWA3_G27"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_ZO4x30"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [];
_aufrufer setVariable ["AGM_IsEOD", true, true]; // Festlegen ob Spieler Explosive Ordnance Disposal Möglichkeiten hat
};
// === SONDERKLASSEN ===
case "gruppenscharfschuetze" :
{
// === STAMMDATEN ===
_typLesbar = "#A Gruppenscharfschütze";
_uniform = "BWA3_Vest_Marksman_Fleck";
_vest = "BWA3_Vest_Marksman_Fleck";
_backpack = "GLT_Carryall_Flecktarn";
_headgear = "GLT_Combat_Helmet_Grass";
_googles = "G_mas_wpn_bala_mask";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"ItemcTabHCam",
"optic_Nightstalker",
"20Rnd_mas_762x51_Stanag",
"20Rnd_mas_762x51_Stanag",
"20Rnd_mas_762x51_Stanag",
"20Rnd_mas_762x51_T_Stanag",
"20Rnd_mas_762x51_T_Stanag",
"20Rnd_mas_762x51_T_Stanag"
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
"RH_12Rnd_45cal_usp",
"RH_12Rnd_45cal_usp",
"RH_12Rnd_45cal_usp",
"APERSTripMine_Wire_Mag",
"APERSTripMine_Wire_Mag",
"muzzle_mas_snds_SMc",
"Pomi_Goggles"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"srifle_mas_hk417_v",
"RH_usp"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_20x50"
];
_handgunItems = ["RH_aacusp", "RH_X2"] + _stdHandgunItems;
_linkItems = _stdLinkItems + ["AGM_ItemKestrel"];
};
case "scharfschuetze" :
{
// === STAMMDATEN ===
_typLesbar = "#B Scharfschütze";
_uniform = "BWA3_Vest_Marksman_Fleck";
_vest = "BWA3_Vest_Marksman_Fleck";
_backpack = "GLT_Carryall_Flecktarn";
_headgear = "GLT_Combat_Helmet_Grass";
_googles = "G_mas_wpn_bala_mask";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"ItemcTabHCam",
"optic_Nightstalker",
"20Rnd_mas_762x51_Stanag",
"20Rnd_mas_762x51_Stanag",
"20Rnd_mas_762x51_Stanag",
"20Rnd_mas_762x51_T_Stanag",
"20Rnd_mas_762x51_T_Stanag",
"20Rnd_mas_762x51_T_Stanag"
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
"RH_12Rnd_45cal_usp",
"RH_12Rnd_45cal_usp",
"RH_12Rnd_45cal_usp",
"APERSTripMine_Wire_Mag",
"APERSTripMine_Wire_Mag",
"muzzle_mas_snds_SMc",
"Pomi_Goggles"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"srifle_mas_hk417_v",
"RH_usp"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_20x50"
];
_handgunItems = ["RH_aacusp", "RH_X2"] + _stdHandgunItems;
_linkItems = _stdLinkItems + ["AGM_ItemKestrel"];
};
case "spotter" :
{
_typLesbar = "#C Spotter";
_itemsToUniform = _stdItemsToUniform + [
];
_linkItems = _stdLinkItems + [
"ACE_SpottingScope",
"ACE_Kestrel4500",
"ACRE_PRC148_UHF"
];
_itemsToBackpack = _diverseSmokeGranaten + [
"ACE_Medkit",
"ACE_Medkit",
"ACE_Bandage",
"ACE_Bandage",
"ACE_LargeBandage",
"ACE_LargeBandage",
"ACE_Morphine",
"ACE_Morphine",
"Ace_Epinephrine",
"Ace_Epinephrine",
"5Rnd_86x70_L115A1",
"5Rnd_86x70_L115A1",
"5Rnd_86x70_L115A1"
];
_weapons = [
"ACE_BackPack_ACR_FL",
"ACE_G36A2"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_ZO4x30"
];
_handgunItems = _stdHandgunItems + [];
};
case "pilot" :
{
// === STAMMDATEN ===
_typLesbar = "#D Pilot";
_uniform = "BWA3_Uniform_Crew_Fleck";
_vest = "GLT_Vest_Light1_Flecktarn";
_backpack = "tf_rt1523g_big_bwmod";
_headgear = "H_PilotHelmetHeli_O";
_googles = "G_Aviator";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"hlc_30Rnd_9x19_GD_MP5",
"hlc_30Rnd_9x19_GD_MP5",
"hlc_30Rnd_9x19_GD_MP5",
"hlc_30Rnd_9x19_GD_MP5",
"hlc_30Rnd_9x19_GD_MP5"
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
"hlc_smg_mp5k_PDW",
"SMA_AIMPOINT",
"BWA3_Beret_HFlieger"
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_RSAS"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [];
};
case "crew" :
{
// === STAMMDATEN ===
_typLesbar = "#E Crew";
_uniform = "BWA3_Uniform_Crew_Fleck";
_vest = "GLT_Vest_Light1_Flecktarn";
_backpack = "";
_headgear = "H_CrewHelmetHeli_O";
_googles = "G_Aviator";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"hlc_30Rnd_9x19_GD_MP5",
"hlc_30Rnd_9x19_GD_MP5",
"hlc_30Rnd_9x19_GD_MP5",
"hlc_30Rnd_9x19_GD_MP5",
"hlc_30Rnd_9x19_GD_MP5",
"BWA3_30Rnd_556x45_G36_AP",
"BWA3_30Rnd_556x45_G36_AP",
"BWA3_30Rnd_556x45_G36_AP",
"BWA3_30Rnd_556x45_G36_AP",
"BWA3_30Rnd_556x45_G36_AP"
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
""
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"BWA3_G36K"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_RSAS"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [];
};
case "uavOperator" :
{
// === STAMMDATEN ===
_typLesbar = "#F UAV-Operator";
_vest = "GLT_Vest_Flecktarn";
_backpack = "GLT_Backpack_Flecktarn_UAV";
_headgear = "GLT_Helmet_Light_Flecktarn";
// === AUSRÜSTUNG IN UNIFORM, VESTE, BACKPACK ===
_itemsToUniform = _stdItemsToUniform + [
];
_itemsToVest = [
"AGM_UAVBattery"
] + _stdItemsToVest;
_itemsToBackpack = _stdItemsToBackpack + [
""
];
// === WAFFEN UND AUFSÄTZE ===
_weapons = [
"BWA3_G27",
"Laserdesignator"
] + _stdWeapons;
_primaryWeaponItems = _stdPrimaryWeaponItems + [
"BWA3_optic_ZO4x30"
];
_handgunItems = _stdHandgunItems + [];
_linkItems = _stdLinkItems + [
"B_UavTerminal"
];
};
default {
_typLesbar = "Ungültig";
};
};
// === KLAMOTTEN UND ZUSÄTZE ANZIEHEN ===
if (_uniform != "") then { _aufrufer forceAddUniform _uniform };
if (_vest != "") then { _aufrufer addVest _vest };
if (_backpack != "") then { _aufrufer addBackpack _backpack };
if (_headgear != "") then { _aufrufer addHeadgear _headgear } ;
if (_googles != "") then { _aufrufer addGoggles _googles };
// === SPIELER AUSRÜSTEN ===
if (_uniform != "") then { {_aufrufer addItemToUniform _x } forEach _itemsToUniform };
if (_vest != "") then { {_aufrufer addItemToVest _x } forEach _itemsToVest };
if (_backpack != "") then { {_aufrufer addItemToBackpack _x} forEach _itemsToBackpack };
// {_aufrufer addMagazine _x} forEach _ammo; // Magazine VOR Waffen zuweisen, dann muss nicht manuell nachgeladen werden
{_aufrufer addWeapon _x} forEach _weapons;
{_aufrufer linkItem _x} forEach _linkItems;
{_aufrufer addPrimaryWeaponItem _x} forEach _primaryWeaponItems;
{_aufrufer addHandgunItem _x} forEach _handgunItems;
[_aufrufer, "QRF_jgkp"] call bis_fnc_setUnitInsignia;
// === PROZESS ABSCHLIESSEN ===
_aufrufer selectWeapon (primaryWeapon _aufrufer);
systemChat format ["Standardausrüstung '%1' zugewiesen!", _typLesbar];
//_anbieter removeAction _actionId;
Im Ordner "media" werden Grafiken und Sounds gespeichert.
/*
File: soundDefinitionen.h
Autor: Thomas 'smallfly' Ludwig aka 'Schmitt'
*/
class sireneSpezial
{
// https://www.freesound.org/people/mungous/sounds/62878/
// Artist: mungous
// Lizenz: Attribution Noncommercial License
name = "sireneSpezial";
sound[] = {"\media\sounds\sirenen\sireneSpezial.ogg", 1.0, 1};
titles[] = {};
};
class sireneDorf
{
// Quelle: http://www.einsatzvideos.net
name = "sireneDorf";
sound[] = {"\media\sounds\sirenen\sireneDorf.ogg", 1.3, 1};
titles[] = {};
};
Es bleibt der Ordner "thirdparty". Darin finden wir alle Skripte, welche wir nicht unser Eigen nennen dürfen, wir aber für unsere
Mission einsetzen: