====== ArmA 2 Object Compositions ====== **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; }";