====== ArmA 2 Object Compositions ======
[[https://www.pmctactical.org/forum/viewforum.php?f=50|ArmA 2 Forum]], [[:arma2|ArmA 2 Home]], [[arma2:config|ArmA 2 Config]], [[arma2:file_formats|ArmA 2 File Formats]], [[arma2:missions|ArmA 2 Missions]], [[arma2:modeling|ArmA 2 3D Modeling]], [[arma2:scripting|ArmA 2 Scripting]], [[arma2:terrain|ArmA 2 Terrain]], [[arma2:texturing|ArmA 2 Texturing]], [[arma2:tools|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",";"]
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;
}";