ArmA 2 Object Compositions

ArmA 2 Forum, ArmA 2 Home, ArmA 2 Config, ArmA 2 File Formats, ArmA 2 Missions, ArmA 2 3D Modeling, ArmA 2 Scripting, ArmA 2 Terrain, ArmA 2 Texturing, ArmA 2 Tools

Introduction

The Dynamic Object module (DynO) was made to make spawning entire sets / templates of objects much easier (e.g. an entire base). It is possible to spawn specific sets of objects or ask a library for a random set matching a list of tags. The system is flexible so that anyone may grab new sets, register them and all systems using the DynO sets will spawn the new sets as well.

How to add bis compositions

To add one of the bis premade compositions simply create a gamelogic and the code below into the init field

_newComp = [(getPos this), (getDir this), "FuelDump1_US"] call (compile (preprocessFileLineNumbers "ca\modules\dyno\data\scripts\objectMapper.sqf"));

Where “FuelDump1_US” is the composition name you want to spawn (check composition library for names of bis compositions). You can also spawn compositions by searching the library for matching tags, for example:

_newComp = [(getPos this), random 360, ["usmc", "medium"]] call (compile (preprocessFileLineNumbers "ca\modules\dyno\data\scripts\objectMapper.sqf"));

Where “usmc” & “medium” are the tags used.

Creating custom compositions

How to create a custom composition:

1) Download the customized (from this post) objectGrabber & objectMapper scripts

2) Open the editor (2d) using the map “Render Island” or another island with some flat space.

3) Create & save a mission. Then put the objectGrabber.sqf script into the mission folder.

4) Place your objects on the map.

5) If you want a custom object init you have to use this format in the initialization field of the object otherwise it wont be grabbed: this setvariable [“VehicleInit”,“<YOUR INITSTRING>;”]

6) Place the player unit in the middle of your composition and put this in its init:

null = [getpos this,200] execVM "objectGrabber.sqf"; // (200 is the radius, adjust when needed).

7) Preview the mission, the objects are now written in arma2.rpt

8) Copy all text between “startgrabbing” and “endgrabbing” (not the ### lines) and paste this in the file composition_template.sqf at the marked area.

9) Remove , at the last line of the copied text.

//     Example arma2.rpt:
     ["MASH",[0,0,0],0,1,0],
     ["Land_GuardShed",[35.9503,29.7019,0],0,1,0,{}],
     ["ACamp",[-41.3973,-33.6524,0],0,1,0,{}],
 
//     After editing:
 
private ["_objs"];
_objs =
[
 
     ["MASH",[0,0,0],0,1,0],
     ["Land_GuardShed",[35.9503,29.7019,0],0,1,0,{}],
     ["ACamp",[-41.3973,-33.6524,0],0,1,0,{}]
 
];
_objs

It should now look like the example in with the scripts

10) Then save the file as “yourCompositionName.sqf”

Spawning custom compositions

To place your custom composition in your mission

1) Place the objectMapper.sqf file into your mission directory.

2) Create a folder called 'compositions' in your mission directory and place the composition there.

3) Place a game logic on the map and put this in the init: null = [“test_comp”, getDir this, getPos this] execVM “objectMapper.sqf (replace “test_comp” with your own compositioname without '.sqf')

4) Preview the mission and your composition is placed (you can place multiple and different compositions at once).

Compositions Library

List of classnames

SmallBase
CityBase01
CityBase02
CityBase04
BunkerMedium01
BunkerMedium02
BunkerMedium03
BunkerMedium04
BunkerMedium05
BunkerMedium06
BunkerMedium07
BunkerMedium08
BunkerMedium09
BunkerMedium10
GuardPost_US
GuardPost2_US
GuardPost3_US
GuardPost4_US
GuardPost5_US
GuardPost6_US
GuardPost7_US
GuardPost8_US
SmallNest_US
VehicleShelter_US
FuelDepot_US
CheckPoint1_US
AntiAir1_US
Firebase1_US
FuelDump1_US
RadarSite1_US
VehicleParking1_US
HeliParking1_US
AirplaneParking1_US
WeaponsStore1_US
Camp1_US
Camp2_US
Camp3_US
MediumTentCamp_RU
MediumTentCamp2_RU
MediumTentCamp3_RU
AntiAir1_RU
Firebase1_RU
FuelDump1_RU
RadarSite1_RU
VehicleParking1_RU
HeliParking1_RU
AirplaneParking1_RU
WeaponsStore1_RU
Camp1_RU
Camp2_RU
GuardPost_CDF
VehicleShelter_CDF
TankDitch_CDF
TankDitch2_CDF
CityBase03
BunkerSmall01
MediumTentCamp_napa
SmallTentCamp_napa
SmallTentCamp2_napa
Camp1_INS
Camp2_INS
FiringRange1
FiringRange2
FiringRange3
FiringRange4
FiringRange5
FiringRange6
FiringRange7
FiringRange8
FiringRange9
FiringRange10
FiringRange11
FiringRange_Wreck1
FiringRange_Wreck2
FiringRange_Wreck3
FiringRange_Wreck4
FiringRange_Wreck5
FiringRange_Wreck6
FiringRange_Wreck7
FiringRange_Water1
FiringRange_Water2

List of classnames: OA

SmallBase_EP1
CityBase01_EP1
CityBase02_EP1
CityBase04_EP1
BunkerMedium01_EP1
BunkerMedium02_EP1
BunkerMedium03_EP1
BunkerMedium04_EP1
BunkerMedium05_EP1
BunkerMedium06_EP1
BunkerMedium07_EP1
BunkerMedium08_EP1
BunkerMedium09_EP1
BunkerMedium10_EP1
GuardPost_US_EP1
GuardPost2_US_EP1
GuardPost3_US_EP1
GuardPost4_US_EP1
GuardPost5_US_EP1
GuardPost6_US_EP1
GuardPost7_US_EP1
GuardPost8_US_EP1
SmallNest_US_EP1
VehicleShelter_US_EP1
FuelDepot_US_EP1
CheckPoint1_US_EP1
AntiAir1_US_EP1
Firebase1_US_EP1
FuelDump1_US_EP1
RadarSite1_US_EP1
VehicleParking1_US_EP1
HeliParking1_US_EP1
AirplaneParking1_US_EP1
WeaponsStore1_US_EP1
Camp1_US_EP1
Camp2_US_EP1
Camp3_US_EP1
MediumTentCamp_TK_EP1
MediumTentCamp2_TK_EP1
MediumTentCamp3_TK_EP1
AntiAir1_TK_EP1
Firebase1_TK_EP1
FuelDump1_TK_EP1
RadarSite1_TK_EP1
VehicleParking1_TK_EP1
HeliParking1_TK_EP1
AirplaneParking1_TK_EP1
WeaponsStore1_TK_EP1
Camp1_TK_EP1
Camp2_TK_EP1
GuardPost_CZ_EP1
VehicleShelter_CZ_EP1
TankDitch_CZ_EP1
TankDitch2_CZ_EP1
CityBase03_CZ_EP1
BunkerSmall01_CZ_EP1
MediumTentCamp_GUE_EP1
SmallTentCamp_GUE_EP1
SmallTentCamp2_GUE_EP1
Camp1_TKM_EP1
Camp2_TKM_EP1
MPA_infoKiosk1
MPA_infoKiosk2
MPA_infoKiosk3

Example

Code to create all compositions on map with named markers. In editor all you need is a player unit and then the code below into init.sqf. Use ALT-LMB to teleport around.

// init.sqf
private["_posX", "_posY", "_i", "_cfg", "_count", "_cfgiName", "_markerName", "_cfgiTags"];
 
sleep 1;
 
_posX = (getPos player) select 0;
_posY = ((getPos player) select 1) + 50;
 
// Read Config File
_cfg =(configFile >> "CfgObjectCompositions");
_count = count _cfg;
 
hintSilent "Starting Composition Generation...";
 
for [{_i = 0}, {_i < _count}, {_i = _i + 1}] do
{
	_cfgiName = configName (_cfg select _i);
	_cfgiTags = getArray ((_cfg select _i) >> "tags");
 
	// Create Marker
	_markerName = createMarker["mrk" + _cfgiName, [_posX + (_i%8)*400, _posY + floor(_i/8)*90 + (_i%2)*45]];
	_markerName setMarkerShape "ICON";
	_markerName setMarkerType "FOB";
	_markerName setMarkerText _cfgiName;
 
	// Marker Color
	if ("west" in _cfgiTags) then { _markerName setMarkerColor "ColorBlue"; };
	if ("east" in _cfgiTags) then { _markerName setMarkerColor "ColorRed"; };
	if ("resistance" in _cfgiTags) then { _markerName setMarkerColor "ColorYellow"; };
 
	// Create Composition
	_newComp = [(getMarkerPos _markerName), (markerDir _markerName), _cfgiName] call (compile (preprocessFileLineNumbers "ca\modules\dyno\data\scripts\objectMapper.sqf"));
 
};
 
hintSilent "..done!";
 
// Teleport with ALT + LMB
onMapSingleClick "
if ((local player) and _alt) then
{
	(vehicle player) setPos _pos;
}";