Static Missions! And MORE!

* ** NEW CONFIG VALUES:

|DMS_MaxStaticMissions|
|DMS_TimeToFirstStaticMission|
|DMS_TimeBetweenStaticMissions|
|DMS_StaticMissionTimeOut|
|DMS_StaticMissionTimeoutResetRange|
|DMS_StaticMinPlayerDistance|
|DMS_UsePredefinedMissionLocations|
|DMS_PredefinedMissionLocations|
|DMS_MinDistFromWestBorder|
|DMS_MinDistFromEastBorder|
|DMS_MinDistFromSouthBorder|
|DMS_MinDistFromNorthBorder|
|DMS_StaticMissionTypes|
**
* Added new value "DMS_Version".
* ** "DMS_fnc_SpawnAIStatic" is now "DMS_fnc_SpawnAIStaticMG";
donthasslethehoff, mercbase, and testmission have been updated with the
new names**
* DMS will now check to make sure that marker colors passed to
fn_CreateMarker are valid marker colors.
* You can now control how far away from each border a mission will spawn
(each border is separate: west, east, south, north). All "supported"
maps have config values adjusted in "map_configs".
* New salt flats base by [Darth Rogue from
SOA](http://soldiersofanarchy.net/).
* **IMPLEMENTED STATIC MISSIONS (initial version). "saltflats" is
currently the only static mission for Altis ONLY. However, it shouldn't
be too difficult to export it to other maps (once positions have been
adjusted). **
* Fixed a couple of outdated/inaccurate function documentation comments.
* **FINALLY REMOVED THE Default Value "-1" PARAMS RPT SPAM. I FOUND IT.
YESSSSS**
* Fixed fn_CleanUp producing debug logs even with debug disabled.
* Fixed the CleanUp list not Cleaning Up after itself (hah!).
* Added diag_tickTime and DMS_Version to debug logs.
* You can now define a custom function for DMS_FillCrate. It will be
passed params from _lootValues select 0. ** I haven't tested this at
all. Just keep that in mind ;) **
* You can now manually define mission spawning locations into an array,
and that array will be used to find a location. Each location will still
be checked for validity, and if no valid positions are found from the
list, a random one is then generated using the normal method. ** I
didn't test this part at all either :P **
* fn_FindSafePos should be even more efficient now, and even more
controllable.
* Quite a few new functions; most notably: fn_GroupReinforcementsManager
* fn_GroupReinforcementsManager is used by static missions to provide
reinforcements for AI once they fall below a certain threshold (and/or
any other parameters you provide). Make sure to check out the function
documentation and give any suggestions for new reinforcement types!
* New function "DMS_fnc_ImportFromM3E_Static" will simply import a base
from the provided file (under static). No conversion to relative
position or anything. Simply spawning, positioning, and disabling
simulation.
* Removed the check for being outside map edges from fn_isValidPosition.
* "hardcore" AI will now be even more difficult ;)
This commit is contained in:
eraser1 2015-10-30 21:18:58 -05:00
parent cc6906cc2c
commit 9b8e4e1573
45 changed files with 2723 additions and 383 deletions

View File

@ -0,0 +1 @@
x\addons\DMS

View File

@ -29,6 +29,7 @@ class CfgFunctions
{
file = "\x\addons\dms\scripts";
class AddMissionToMonitor {};
class AddMissionToMonitor_Static {};
class AILocalityManager {};
class BroadcastMissionStatus {};
class CalcPos {};
@ -39,15 +40,21 @@ class CfgFunctions
class FillCrate {};
class FindSafePos {};
class FindSuppressor {};
class GetAllUnits {};
class GroupReinforcementsManager {};
//class HandleMissionEvents {};
//class HeliParatroopers {};
//class HeliPatrol {};
class ImportFromM3E {};
class ImportFromM3E_Convert {};
class ImportFromM3E_Static {};
class IsPlayerNearby {};
class IsNearWater {};
class IsValidPosition {};
class MissionParams {};
class MissionsMonitor {};
class MissionsMonitor_Dynamic {};
class MissionsMonitor_Static {};
class MissionSuccessState {};
class OnKilled {};
class RemoveMarkers {};
@ -60,8 +67,9 @@ class CfgFunctions
class SpawnAIGroup {};
class SpawnAIVehicle {};
class SpawnAISoldier {};
class SpawnAIStatic {};
class SpawnAIStaticMG {};
class SpawnBanditMission {};
class SpawnStaticMission {};
class SpawnCrate {};
class SpawnMinefield {};
class SpawnPersistentVehicle {};

View File

@ -22,14 +22,24 @@ DMS_Use_Map_Config = true; // Whether or not to use config overwrites specific t
/* Mission System Settings */
/*General settings for dynamic missions*/
DMS_DynamicMission = true; // Enable/disable dynamic mission system
DMS_DynamicMission = true; // Enable/disable dynamic mission system.
DMS_MaxBanditMissions = 3; // Maximum number of Bandit Missions running at the same time
DMS_StaticMission = false; // Enable/disable static missions
DMS_TimeToFirstMission = [180,420]; // [Minimum,Maximum] time between first mission spawn.
DMS_TimeToFirstMission = [180,420]; // [Minimum,Maximum] time between first mission spawn. | DEFAULT: 3-7 minutes.
DMS_TimeBetweenMissions = [600,900]; // [Minimum,Maximum] time between missions (if mission limit is not reached) | DEFAULT: 10-15 mins
DMS_MissionTimeOut = [900,1800]; // [Minimum,Maximum] time it will take for a mission to timeout | Default: 15-30 mins
DMS_MissionTimeOut = [900,1800]; // [Minimum,Maximum] time it will take for a mission to timeout | DEFAULT: 15-30 mins
DMS_MissionTimeoutResetRange = 1000; // If a player is this close to a mission then it won't time-out. Set to 0 to disable this check.
/*General settings for dynamic missions*/
/*General settings for static missions*/
DMS_StaticMission = true; // Enable/disable static mission system.
DMS_MaxStaticMissions = 1; // Maximum number of Static Missions running at the same time. It's recommended you set this to the same amount of static missions that you have in total.
DMS_TimeToFirstStaticMission = [180,420]; // [Minimum,Maximum] time between first static mission spawn. | DEFAULT: 3-7 minutes.
DMS_TimeBetweenStaticMissions = [900,1800]; // [Minimum,Maximum] time between static missions (if static mission limit is not reached) | DEFAULT: 15-30 mins
DMS_StaticMissionTimeOut = [1800,3600]; // [Minimum,Maximum] time it will take for a static mission to timeout | DEFAULT: 30-60 mins
DMS_StaticMissionTimeoutResetRange = 1500; // If a player is this close to a mission then it won't time-out. Set to 0 to disable this check.
DMS_StaticMinPlayerDistance = 1500; // If a player is this close to a mission location, then it won't spawn the mission and will wait 60 seconds before attempting to spawn it.
/*General settings for static missions*/
DMS_playerNearRadius = 100; // How close a player has to be to a mission in order to satisfy the "playerNear" mission requirement (can be customized per mission).
DMS_AI_KillPercent = 100; // The percent amount of AI that need to be killed for "killPercent" mission requirement (NOT IMPLEMENTED)
@ -41,7 +51,7 @@ DMS_Use_Map_Config = true; // Whether or not to use config overwrites specific t
DMS_MarkerText_ShowAICount = true; // Whether or not to display the number of remaining AI in the marker name.
DMS_MarkerText_AIName = "Units"; // What the AI will be called in the map marker. For example, the marker text can show: "Car Dealer (3 Units remaining)"
DMS_MarkerPosRandomization = false; // Randomize the position of the circle marker of a mission
DMS_MarkerPosRandomRadius = [25,100]; // Minimum/Maximum distance that the circle marker position will be randomized | Default: 0 meters to 200 meters
DMS_MarkerPosRandomRadius = [25,100]; // Minimum/Maximum distance that the circle marker position will be randomized | DEFAULT: 0 meters to 200 meters
DMS_RandomMarkerBrush = "Cross"; // See: https://community.bistudio.com/wiki/setMarkerBrush
DMS_MissionMarkerWinDot = true; // Keep the mission marker dot with a "win" message after mission is over
DMS_MissionMarkerLoseDot = true; // Keep the mission marker dot with a "lose" message after mission is over
@ -51,16 +61,18 @@ DMS_Use_Map_Config = true; // Whether or not to use config overwrites specific t
DMS_MissionMarkerLoseDotColor = "ColorRed"; // The color of the "lose" marker dot
/*Mission Marker settings*/
/*Mission Cleanup/Timeout settings*/
/*Mission Cleanup settings*/
DMS_CompletedMissionCleanup = true; // Cleanup mission-spawned buildings and AI bodies after some time
DMS_CompletedMissionCleanupTime = 3600; // Minimum time until mission-spawned buildings and AI are cleaned up
DMS_CleanUp_PlayerNearLimit = 20; // Cleanup of an object is aborted if a player is this many meters close to the object
DMS_AIVehCleanUpTime = 900; // Time until a destroyed AI vehicle is cleaned up.
DMS_MissionTimeoutReset = true; // Enable mission timeout timer reset if a player is close
DMS_MissionTimeoutResetRange = 1000; // If a player is this close to a mission then it won't time-out
/*Mission Cleanup/Timeout settings*/
/*Mission Cleanup settings*/
/*Mission spawn location settings*/
DMS_UsePredefinedMissionLocations = false; // Whether or not to use a list of pre-defined mission locations instead before attempting to find a random (valid) position. The positions will still be checked for validity. If none of the provided positions are valid, a random one will be generated.
DMS_PredefinedMissionLocations = [ // List of Preset/Predefined mission locations.
];
DMS_ThrottleBlacklists = true; // Whether or not to "throttle" the blacklist distance parameters in DMS_fnc_FindSafePos. This will reduce the values of the minimum
//distances for some of the below parameters if several attempts have been made, but a suitable position was not yet found. This
//should help with server performance drops when spawning a mission, as DMS_fnc_findSafePos is the most resource-intensive function.
@ -74,6 +86,10 @@ DMS_Use_Map_Config = true; // Whether or not to use config overwrites specific t
DMS_WaterNearBlacklist = 500; // Missions won't spawn in a position this many meters close to water
DMS_TerritoryNearBlacklist = 100; // Missions won't spawn in a position this many meters close to a territory flag
DMS_MinSurfaceNormal = 0.9; // Missions won't spawn in a position where its surfaceNormal is less than this amount. The lower the value, the steeper the location. Greater values means flatter locations. Values can range from 0-1, with 0 being sideways, and 1 being perfectly flat. For reference: SurfaceNormal of about 0.7 is when you are forced to walk up a surface. If you want to convert surfaceNormal to degrees, use the arc-cosine of the surfaceNormal. 0.9 is about 25 degrees. Google "(arccos 0.9) in degrees"
DMS_MinDistFromWestBorder = 250; // Missions won't spawn in a position this many meters close to the western map border.
DMS_MinDistFromEastBorder = 250; // Missions won't spawn in a position this many meters close to the easter map border.
DMS_MinDistFromSouthBorder = 250; // Missions won't spawn in a position this many meters close to the southern map border.
DMS_MinDistFromNorthBorder = 250; // Missions won't spawn in a position this many meters close to the northern map border.
/*Mission spawn location settings*/
DMS_MinWaterDepth = 20; // Minimum depth of water that an underwater mission can spawn at.
@ -156,6 +172,13 @@ DMS_Use_Map_Config = true; // Whether or not to use config overwrites specific t
["behindenemylines",2],
["mercbase",1]
];
DMS_StaticMissionTypes = [ // List of STATIC missions with spawn chances.
];
DMS_findSafePosBlacklist = [ // For BIS_fnc_findSafePos position blacklist info refer to: https://community.bistudio.com/wiki/BIS_fnc_findSafePos
// An example is given in the altis_config.sqf (it blacklists the salt flats).

View File

@ -1,10 +1,18 @@
/*
Launches mission functions
Made for Defent for Defents Mission System
And for Numenadayz.com
Written by eraser1
DMS post-init
Created by eraser1 and Defent
*/
if !(isServer) exitWith
{
for "_i" from 0 to 99 do
{
diag_log "The DMS PBO is SERVER ONLY. It will NOT work for any form of client! DMS launch cancelled.";
};
};
RESISTANCE setFriend[WEST,0];
WEST setFriend[RESISTANCE,0];
RESISTANCE setFriend[EAST,0];
@ -18,86 +26,103 @@ if ((!isNil "A3XAI_isActive") && {!DMS_ai_offload_Only_DMS_AI}) then
DMS_ai_offload_Only_DMS_AI = true;
};
if(DMS_StaticMission) then
DMS_A3_AllMarkerColors = [];
for "_i" from 0 to ((count(configfile >> "CfgMarkerColors"))-1) do
{
call compileFinal preprocessFileLineNumbers "\x\addons\dms\static\static_init.sqf";//<---- TODO
DMS_A3_AllMarkerColors pushBack (toLower (configName ((configfile >> "CfgMarkerColors") select _i)));
};
if (DMS_DynamicMission) then
{
DMS_AttemptsUntilThrottle = DMS_AttemptsUntilThrottle + 1;
DMS_CLIENT_fnc_spawnDynamicText = compileFinal
("
DMS_CLIENT_fnc_spawnDynamicText = compileFinal
("
[
_this,
0,
safeZoneY,
"+str DMS_dynamicText_Duration+",
"+str DMS_dynamicText_FadeTime+",
0,
24358
] spawn BIS_fnc_dynamicText;
");
publicVariable "DMS_CLIENT_fnc_spawnDynamicText";
DMS_CLIENT_fnc_spawnTextTiles = compileFinal
("
[
parseText _this,
[
_this,
0,
safeZoneY,
"+str DMS_dynamicText_Duration+",
"+str DMS_dynamicText_FadeTime+",
0,
24358
] spawn BIS_fnc_dynamicText;
");
publicVariable "DMS_CLIENT_fnc_spawnDynamicText";
1,
1
],
[10,10],
"+str DMS_textTiles_Duration+",
"+str DMS_textTiles_FadeTime+",
0
] spawn BIS_fnc_textTiles;
");
publicVariable "DMS_CLIENT_fnc_spawnTextTiles";
DMS_CLIENT_fnc_spawnTextTiles = compileFinal
("
[
parseText _this,
[
0,
safeZoneY,
1,
1
],
[10,10],
"+str DMS_textTiles_Duration+",
"+str DMS_textTiles_FadeTime+",
0
] spawn BIS_fnc_textTiles;
");
publicVariable "DMS_CLIENT_fnc_spawnTextTiles";
// Set up the minimum/maximum co-ordinate values for x and y...
DMS_MinMax_X_Coords = [DMS_MinDistFromWestBorder, worldSize - DMS_MinDistFromEastBorder];
DMS_MinMax_Y_Coords = [DMS_MinDistFromSouthBorder, worldSize - DMS_MinDistFromNorthBorder];
if (DMS_DynamicMission || {DMS_StaticMission}) then
{
call compileFinal preprocessFileLineNumbers "\x\addons\dms\missions\static_init.sqf";
call compileFinal preprocessFileLineNumbers "\x\addons\dms\missions\mission_init.sqf";
if (DMS_ShowDifficultyColorLegend) then
{
private "_title";
_title = createmarker ["DMS_MissionMarker_DifficultyColorLegend",[-500,-200]];
_title setMarkerColor "ColorRed";
_title setmarkertext "DMS Mission Difficulties Color Legend";
_title setMarkerType "mil_dot";
_title setMarkerAlpha 0.5;
{
private ["_difficulty", "_color", "_num", "_pos", "_circle", "_dot"];
_difficulty = _x;
switch (_difficulty) do
{
case "easy": {_color = "ColorGreen";};
case "moderate": {_color = "ColorYellow";};
case "difficult": {_color = "ColorRed";};
case "hardcore" : {_color = "ColorBlack";};
};
_num = -200 * (_forEachIndex - 0.5);
_pos = [100,_num];
_circle = createMarker [format ["DMS_MissionMarker_DifficultyColor_%1",_color], _pos];
_circle setMarkerColor _color;
_circle setMarkerShape "ELLIPSE";
_circle setMarkerBrush "Solid";
_circle setMarkerSize [100,100];
_dot = createMarker [format ["DMS_MissionMarker_Difficulty_%1",_difficulty],_pos];
_dot setMarkerColor "ColorWhite";
_dot setMarkerType "mil_dot";
_dot setMarkerAlpha 0.5;
_dot setMarkerText _difficulty;
} forEach ["hardcore","difficult","moderate","easy"];
};
execFSM "\x\addons\dms\FSM\missions.fsm";
}
else
{
diag_log "Enjoy the DMS functions! :)";
};
if (DMS_ShowDifficultyColorLegend) then
{
private "_title";
_title = createmarker ["DMS_MissionMarker_DifficultyColorLegend",[-500,-200]];
_title setMarkerColor "ColorRed";
_title setmarkertext "DMS Mission Difficulties Color Legend";
_title setMarkerType "mil_dot";
_title setMarkerAlpha 0.5;
{
private ["_difficulty", "_color", "_num", "_pos", "_circle", "_dot"];
DMS_Version = "October 30 2015";
_difficulty = _x;
switch (_difficulty) do
{
case "easy": {_color = "ColorGreen";};
case "moderate": {_color = "ColorYellow";};
case "difficult": {_color = "ColorRed";};
case "hardcore" : {_color = "ColorBlack";};
};
_num = -200 * (_forEachIndex - 0.5);
_pos = [100,_num];
_circle = createMarker [format ["DMS_MissionMarker_DifficultyColor_%1",_color], _pos];
_circle setMarkerColor _color;
_circle setMarkerShape "ELLIPSE";
_circle setMarkerBrush "Solid";
_circle setMarkerSize [100,100];
_dot = createMarker [format ["DMS_MissionMarker_Difficulty_%1",_difficulty],_pos];
_dot setMarkerColor "ColorWhite";
_dot setMarkerType "mil_dot";
_dot setMarkerAlpha 0.5;
_dot setMarkerText _difficulty;
} forEach ["hardcore","difficult","moderate","easy"];
};
"DMS post-init complete." call DMS_fnc_DebugLog;

View File

@ -5,6 +5,8 @@
DMS_HC_Object = objNull;
DMS_CleanUpList = [];
//Load main config
call compileFinal preprocessFileLineNumbers "\x\addons\dms\config.sqf";
@ -133,4 +135,6 @@ DMS_fnc_setRelPositions =
};
// Because I fucked up the name on first implementation and don't want to mess anybody up who didn't realize to change every occurence of "DMS_MaxSurfaceNormal" to "DMS_MinSurfaceNormal".
DMS_MaxSurfaceNormal = DMS_MinSurfaceNormal;
DMS_MaxSurfaceNormal = DMS_MinSurfaceNormal;
DMS_AttemptsUntilThrottle = DMS_AttemptsUntilThrottle + 1;

View File

@ -19,4 +19,16 @@ DMS_MissionNearBlacklist = 2500;
DMS_WaterNearBlacklist = 500;
// Altis is pretty flat, so we can make the min surfaceNormal ... stricter? more strict? Who cares, you get the idea.
DMS_MinSurfaceNormal = 0.95;
DMS_MinSurfaceNormal = 0.95;
// Making these configs below as strict as possible will help in reducing the number of attempts taken to find a valid position, and as a result, improve performance.
DMS_MinDistFromWestBorder = 2000; // There's at least 2km of ocean from the west edge to the first bit of land.
DMS_MinDistFromEastBorder = 2250; // There's over 2km of ocean from the east edge to the first bit of land.
DMS_MinDistFromSouthBorder = 5000; // There's about 5km of ocean from the south edge to the first bit of land.
DMS_MinDistFromNorthBorder = 5200; // There's around 5km of ocean from the north edge to the first bit of land (including the island).
// Add the "saltflats" mission to the existing mission types.
DMS_StaticMissionTypes pushBack ["saltflats",1];

View File

@ -19,4 +19,12 @@ DMS_MissionNearBlacklist = 2500;
DMS_WaterNearBlacklist = 500;
// Bornholm seems to be fine with a greater minimum surfaceNormal.
DMS_MinSurfaceNormal = 0.95;
DMS_MinSurfaceNormal = 0.95;
// Making these configs below as strict as possible will help in reducing the number of attempts taken to find a valid position, and as a result, improve performance.
DMS_MinDistFromWestBorder = 1000; // About 1km of plain ocean to the west
DMS_MinDistFromEastBorder = 4000; // Just about 4km of ocean to the east
DMS_MinDistFromSouthBorder = 1000; // We get the proper landmass at about 1km from the south
DMS_MinDistFromNorthBorder = 1500; // Avoid getting missions at the northern "tip"

View File

@ -15,4 +15,13 @@ DMS_findSafePosBlacklist =
DMS_WaterNearBlacklist = 200;
// Panthera is super hilly/mountain-y, so we allow a tolerance of up to a 30 degree slope.
DMS_MinSurfaceNormal = 0.85;
DMS_MinSurfaceNormal = 0.85;
// Comment out the below configs if you want missions to be able to spawn on the islands surrounding the mainland.
DMS_MinDistFromWestBorder = 1500;
DMS_MinDistFromEastBorder = 1000;
DMS_MinDistFromSouthBorder = 1500;
DMS_MinDistFromNorthBorder = 2500;

View File

@ -16,4 +16,12 @@ DMS_PlayerNearBlacklist = 2000;
DMS_SpawnZoneNearBlacklist = 2500;
DMS_TraderZoneNearBlacklist = 2500;
DMS_MissionNearBlacklist = 2500;
DMS_WaterNearBlacklist = 500;
DMS_WaterNearBlacklist = 500;
// Making these configs below as strict as possible will help in reducing the number of attempts taken to find a valid position, and as a result, improve performance.
DMS_MinDistFromWestBorder = 500; // The western island is pretty close to the western border.
DMS_MinDistFromEastBorder = 4500; // About 4.5km of ocean from the eastern border to the edge of the main east island. Set to 6000 if you want to "cut off" most of the Taviana Zoo area.
DMS_MinDistFromSouthBorder = 100; // The western island almost touches the southern border so this one is tiny...
DMS_MinDistFromNorthBorder = 3000; // About 3km from the northern tip of the east island to the edge.

View File

@ -69,7 +69,7 @@ _staticGuns =
"assault",
"static",
"bandit"
] call DMS_fnc_SpawnAIStatic;
] call DMS_fnc_SpawnAIStaticMG;
// Create Crates

View File

@ -86,7 +86,7 @@ _staticGuns =
"hardcore",
"bandit",
"O_HMG_01_high_F"
] call DMS_fnc_SpawnAIStatic;
] call DMS_fnc_SpawnAIStaticMG;
(_staticGuns select 0) setDir 15;

View File

@ -66,7 +66,7 @@ _staticGuns =
"assault",
"static",
"bandit"
] call DMS_fnc_SpawnAIStatic;
] call DMS_fnc_SpawnAIStaticMG;
// Create Crate

View File

@ -1,15 +1,14 @@
/*
DMS: mission_init.sqf
mission_init.sqf
Created by eraser1
Initializes variables for DMS
Initializes dynamic mission variables for DMS
*/
diag_log "DMS :: Initializing Mission Variables";
// Initialize Variables
DMS_Mission_Arr = [];
DMS_CleanUpList = [];
DMS_MissionCount = 0;
DMS_RunningBMissionCount = 0;
DMS_BMissionLastStart = diag_tickTime;

View File

@ -0,0 +1,273 @@
/*
"saltflats" static mission for Altis.
Created by eraser1
Credits to "Darth Rogue" for creating the base.
*/
// For logging purposes
_num = DMS_MissionCount;
// Set mission side (only "bandit" is supported for now)
_side = "bandit";
_pos = [23300,18800,0];
if ([_pos,DMS_StaticMinPlayerDistance] call DMS_fnc_IsPlayerNearby) exitWith {"delay"};
// Set general mission difficulty
_difficulty = "hardcore";
// Create AI
_AICount = 20 + (round (random 5));
_group =
[
_pos,
_AICount,
_difficulty,
"random",
_side
] call DMS_fnc_SpawnAIGroup;
_veh =
[
[
[_pos,100,random 360] call DMS_fnc_SelectOffsetPos,
_pos
],
_group,
"assault",
_difficulty,
_side
] call DMS_fnc_SpawnAIVehicle;
_staticGuns =
[
[
[_pos,[-6.29138,3.9917,0]] call DMS_fnc_CalcPos
],
_group,
"assault",
_difficulty,
"bandit",
"O_HMG_01_high_F"
] call DMS_fnc_SpawnAIStaticMG;
_baseObjs = [];
if (isNil "DMS_SaltFlatsBaseSpawned") then
{
_baseObjs =
[
"saltflatsbase"
] call DMS_fnc_ImportFromM3E_Static;
DMS_SaltFlatsBaseSpawned = true;
};
// Create Crate
_crate = ["I_CargoNet_01_ammo_F",_pos] call DMS_fnc_SpawnCrate;
// Define mission-spawned AI Units
_missionAIUnits =
[
_group // We only spawned the single group for this mission
];
// Define the group reinforcements
_groupReinforcementsInfo =
[
[
_group, // pass the group
[
[
5, // Only 5 "waves" (5 vehicles can spawn as reinforcement)
0
],
[
-1, // No need to limit the number of units since we're limiting "waves"
0
]
],
[
300, // At least a 5 minute delay between reinforcements.
diag_tickTime
],
[
[23239.7,18865.8,0],
[23397,18862.8,0],
[23485.5,18861.3,0],
[23486,18683.9,0],
[23493.1,18515.5,0],
[23873.8,19413.2,0],
[23211.9,18572.5,0],
[23212.9,18751.7,0],
[23211.5,18809.1,0]
],
"random",
_difficulty,
_side,
"armed_vehicle",
[
7, // Reinforcements will only trigger if there's fewer than 7 members left in the group
"random" // Select a random armed vehicle from "DMS_ArmedVehicles"
]
],
[
_group, // pass the group (again)
[
[
0, // Let's limit number of units instead...
0
],
[
100, // Maximum 100 units can be given as reinforcements.
0
]
],
[
240, // About a 4 minute delay between reinforcements.
diag_tickTime
],
[
[23500,18750,0.5],
[23498,18715,0.5],
[23461,18478.2,0],
[23443,18495.3,0],
[23424,18479.4,0],
[23405.9,18497,0],
[23387.1,18479.7,0],
[23378.3,18497.6,0],
[23359.2,18480,0],
[23334.9,18479.2,0],
[23295.1,18515.4,3.12796],
[23242.7,18793.5,0.5],
[23387.2,18638.5,0.5],
[23294.6,18640.8,0.2],
[23309.1,18683.1,0.6],
[23308.5,18683,4],
[23360.5,18686.3,4],
[23362.9,18679,0.6],
[23403.1,18685.1,0.6],
[23420.9,18839.6,4.35],
[23420.8,18843.4,12.35],
[23421,18838.6,0.36],
[23422.2,18823.8,0.4],
[23502.1,18862.3,15.37],
[23494.2,18478.6,15.37],
[23206.6,18493.8,15.37],
[23239.4,18561.1,0]
],
"random",
_difficulty,
_side,
"reinforce",
[
10, // Reinforcements will only trigger if there's fewer than 10 members left in the group
7 // 7 reinforcement units per wave.
]
]
];
// Define mission-spawned objects and loot values
_missionObjs =
[
_staticGuns+[_veh], // armed AI vehicle and static gun(s). Note, we don't add the base itself because we don't want to delete it and respawn it if the mission respawns.
[],
[[_crate,[75,250,25]]]
];
// Define Mission Start message
_msgStart = ['#FFFF00', "A heavily guarded base has been located on the salt flats! There are reports they have a large weapon cache..."];
// Define Mission Win message
_msgWIN = ['#0080ff',"Convicts have successfully assaulted the base on the salt flats and secured the cache!"];
// Define Mission Lose message
_msgLOSE = ['#FF0000',"Seems like the guards got bored and left the base, taking the cache with them..."];
// Define mission name (for map marker and logging)
_missionName = "AI Base";
// Create Markers
_markers =
[
_pos,
_missionName,
_difficulty
] call DMS_fnc_CreateMarker;
(_markers select 1) setMarkerSize [500,500];
// Record time here (for logging purposes, otherwise you could just put "diag_tickTime" into the "DMS_AddMissionToMonitor" parameters directly)
_time = diag_tickTime;
// Parse and add mission info to missions monitor
_added =
[
_pos,
[
[
"kill",
_group
],
[
"playerNear",
[_pos,100]
]
],
_groupReinforcementsInfo,
[
_time,
DMS_StaticMissionTimeOut call DMS_fnc_SelectRandomVal
],
_missionAIUnits,
_missionObjs,
[_missionName,_msgWIN,_msgLOSE],
_markers,
_side,
_difficulty,
[[],[]]
] call DMS_fnc_AddMissionToMonitor_Static;
// Check to see if it was added correctly, otherwise delete the stuff
if !(_added) exitWith
{
diag_log format ["DMS ERROR :: Attempt to set up mission %1 with invalid parameters for DMS_fnc_AddMissionToMonitor_Static! Deleting mission objects and resetting DMS_MissionCount.",_missionName];
_cleanup = [];
{
_cleanup pushBack _x;
} forEach _missionAIUnits;
_cleanup pushBack ((_missionObjs select 0)+(_missionObjs select 1));
{
_cleanup pushBack (_x select 0);
} foreach (_missionObjs select 2);
_cleanup call DMS_fnc_CleanUp;
// Delete the markers directly
{deleteMarker _x;} forEach _markers;
// Reset the mission count
DMS_MissionCount = DMS_MissionCount - 1;
};
// Notify players
[_missionName,_msgStart] call DMS_fnc_BroadcastMissionStatus;
if (DMS_DEBUG) then
{
(format ["MISSION: (%1) :: Mission #%2 started at %3 with %4 AI units and %5 difficulty at time %6",_missionName,_num,_pos,_AICount,_difficulty,_time]) call DMS_fnc_DebugLog;
};

View File

@ -0,0 +1,29 @@
/*
static_init.sqf
Created by eraser1
Initializes static mission variables for DMS
*/
diag_log "DMS :: Initializing Mission Variables";
// Initialize Variables
DMS_StaticMission_Arr = [];
DMS_RunningStaticMissions = [];
DMS_StaticMissionLastStart = diag_tickTime;
DMS_StaticMissionDelay = DMS_TimeToFirstStaticMission call DMS_fnc_SelectRandomVal;
if (DMS_DEBUG) then
{
diag_log format ["DMS_DEBUG static_init :: Random time between missions is initially set to %1s | DMS_BMissionLastStart: %2",DMS_StaticMissionDelay,DMS_StaticMissionLastStart];
};
// Set mission frequencies from config
DMS_StaticMissionTypesArray = [];
{
for "_i" from 1 to (_x select 1) do
{
DMS_StaticMissionTypesArray pushBack (_x select 0);
};
} forEach DMS_StaticMissionTypes;

View File

@ -0,0 +1,694 @@
// Credits to Darth Rogue from "http://soldiersofanarchy.net/"
// DMS author(s) did not create the export below. They were created/adapted specifically for DMS by the author above.
[
["Flag_CSAT_F",[23302,18802,0],0,[[0,1,0],[0,0,1]],true],
["Land_HBarrierTower_F",[23216.7,18479.3,0],2.27275,[[0.0396563,0.999213,0],[0,0,1]],false],
["Land_HBarrierTower_F",[23236.4,18478.8,2.38419e-007],1.81822,[[0.0317284,0.999497,0],[0,0,1]],false],
["Land_BarGate_F",[23226.6,18480.6,-0.0227547],1.36359,[[0.0237968,0.999717,0],[0,0,1]],false],
["Land_CncBarrier_stripes_F",[23229.1,18469.9,0],1.36366,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CncBarrierMedium4_F",[23233.4,18470.8,0],92.7273,[[0.998867,-0.0475825,0],[0,-0,1]],false],
["Land_CncBarrierMedium4_F",[23233.1,18463.4,0],92.7273,[[0.998867,-0.0475825,0],[0,-0,1]],false],
["Land_CncBarrierMedium4_F",[23219.2,18463.6,0],92.7273,[[0.998867,-0.0475825,0],[0,-0,1]],false],
["Land_CncBarrierMedium4_F",[23219.6,18471,0],92.7273,[[0.998867,-0.0475825,0],[0,-0,1]],false],
["Land_CncBarrier_stripes_F",[23223.1,18458.2,0],1.36366,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CncBarrierMedium4_F",[23218.9,18456.2,0],92.7273,[[0.998867,-0.0475825,0],[0,-0,1]],false],
["Land_CncBarrierMedium4_F",[23232.8,18456.1,0],92.7273,[[0.998867,-0.0475825,0],[0,-0,1]],false],
["Land_Sign_WarningMilitaryArea_F",[23217.1,18452.7,0],0.909076,[[0.0158659,0.999874,0],[0,0,1]],false],
["Land_Sign_WarningMilitaryArea_F",[23234.3,18452.4,0],0.909097,[[0.0158659,0.999874,0],[0,0,1]],false],
["Land_Airport_Tower_F",[23292,18639.7,0],93.1818,[[0.998458,-0.0555044,0],[0,-0,1]],false],
["Land_Radar_F",[23489.9,18659.8,0],149.091,[[0.513676,-0.857984,0],[0,-0,1]],false],
["Land_PowerGenerator_F",[23295.6,18643.1,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23294.4,18634.9,0],94.0909,[[0.997452,-0.0713387,0],[0,-0,1]],false],
["Land_Pavement_wide_corner_F",[23292.4,18612.5,0],94.5454,[[0.996855,-0.0792492,0],[0,-0,1]],false],
["Land_spp_Panel_F",[23502.9,18594.5,0],2.72727,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Transformer_F",[23455.5,18575.2,0],4.09089,[[0.0713387,0.997452,0],[0,0,1]],false],
["Land_TBox_F",[23365.4,18874.5,0],0,[[0,1,0],[0,0,1]],false],
["Land_TTowerBig_2_F",[23359.7,18873.6,0],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo_Tower_V1_No1_F",[23209.8,18488.6,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Cargo_Tower_V1_No2_F",[23506.8,18865.9,0],1.36361,[[0.0237974,0.999717,0],[0,0,1]],false],
["Land_Cargo_Tower_V1_No3_F",[23498.3,18482.3,0],1.36358,[[0.0237968,0.999717,0],[0,0,1]],false],
["Land_Cargo_Tower_V1_No4_F",[23216.6,18861.9,0],0.454538,[[0.00793294,0.999969,0],[0,0,1]],false],
["Land_i_Barracks_V2_F",[23321.8,18682.9,0],0,[[0,1,0],[0,0,1]],false],
["Land_dp_smallFactory_F",[23489.9,18620.4,0],90.9091,[[0.999874,-0.0158665,0],[0,-0,1]],false],
["Land_spp_Panel_F",[23494.8,18594.9,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23486.7,18595.3,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23478.6,18595.6,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23470.5,18596,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23462.4,18596.4,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23462.1,18590.7,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23470.2,18590.3,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23478.3,18589.9,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23486.4,18589.5,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23494.6,18589.1,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23502.7,18588.7,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23502.4,18583,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23494.3,18583.4,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23478,18584.2,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23469.9,18584.5,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23461.8,18584.9,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23461.5,18579.2,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23469.7,18578.8,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23494,18577.6,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23502.1,18577.2,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23501.8,18571.5,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23493.7,18571.9,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Panel_F",[23461.3,18573.4,-2.38419e-007],2.72726,[[0.0475818,0.998867,0],[0,0,1]],false],
["Land_spp_Transformer_F",[23456,18585.4,0],3.63634,[[0.0634237,0.997987,0],[0,0,1]],false],
["Land_spp_Transformer_F",[23456.5,18595.7,0],4.09088,[[0.0713387,0.997452,0],[0,0,1]],false],
["Land_PowerGenerator_F",[23368.7,18874.7,0],180.455,[[-0.00794149,-0.999968,0],[-0,0,1]],false],
["StorageBladder_01_fuel_sand_F",[23375.1,18872,0],0,[[0,1,0],[0,0,1]],false],
["Land_MilOffices_V1_F",[23328,18631.5,2.38419e-007],1.81821,[[0.0317284,0.999497,0],[0,0,1]],false],
["Land_MilOffices_V1_F",[23384.1,18629.7,2.38419e-007],1.81821,[[0.0317284,0.999497,0],[0,0,1]],false],
["Land_MilOffices_V1_F",[23382.5,18578.9,2.38419e-007],1.81821,[[0.0317284,0.999497,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23294.1,18630.9,0],94.0909,[[0.997452,-0.0713387,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23293.8,18627,0],94.0909,[[0.997452,-0.0713387,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23293.5,18623,0],94.0909,[[0.997452,-0.0713387,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23293.3,18619.1,0],94.0909,[[0.997452,-0.0713387,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23293,18615.2,0],94.0909,[[0.997452,-0.0713387,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23295.3,18612.6,0],4.09096,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23298.3,18612.4,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23301.3,18612.2,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23304.3,18612,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23307.2,18611.8,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23310.2,18611.6,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23313.2,18611.4,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23316.2,18611.1,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23319.2,18610.9,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23322.2,18610.7,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23325.1,18610.5,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23328.1,18610.3,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23331.1,18610.1,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23334.1,18609.9,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23337.1,18609.7,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23340.1,18609.4,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23343,18609.2,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23346,18609,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23349,18608.8,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23352,18608.6,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23355,18608.4,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23357.9,18608.2,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23360.9,18607.9,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23363.9,18607.7,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23366.9,18607.5,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23369.9,18607.3,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23372.9,18607.1,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23375.8,18606.9,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23378.8,18606.7,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23381.8,18606.5,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23384.8,18606.2,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23387.8,18606,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23390.8,18605.8,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23394.5,18605.5,0],4.09097,[[0.0713403,0.997452,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23329.5,18623.5,0],92.2728,[[0.999213,-0.0396575,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23329.4,18620.5,0],92.2728,[[0.999213,-0.0396575,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23329.3,18617.5,0],92.2728,[[0.999213,-0.0396575,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23329.2,18614.5,0],92.2728,[[0.999213,-0.0396575,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23329.1,18611.5,0],92.2728,[[0.999213,-0.0396575,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23342.1,18621.7,0],92.2728,[[0.999213,-0.0396575,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23342,18618.2,0],92.2728,[[0.999213,-0.0396575,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23341.8,18614.8,0],92.2728,[[0.999213,-0.0396575,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23341.7,18611.3,0],92.2728,[[0.999213,-0.0396575,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23385.9,18621.5,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23385.8,18618,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23385.7,18614.5,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23385.6,18611,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23385.5,18607.5,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23398.1,18620,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23398,18616.5,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23397.8,18613,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23397.7,18609.5,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Pavement_wide_F",[23372.9,18593,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23373,18596.5,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23373.2,18600,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23373.3,18603.5,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23316.8,18594.7,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23316.9,18598.2,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23317,18601.7,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23317.1,18605.2,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23317.2,18608.7,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_Pavement_wide_corner_F",[23397.3,18605,0],5.45456,[[0.0950563,0.995472,0],[0,0,1]],false],
["Land_Pavement_wide_F",[23397.6,18607.1,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_i_Barracks_V2_F",[23321.7,18723,0],0,[[0,1,0],[0,0,1]],false],
["Land_i_Barracks_V2_F",[23407.8,18723.1,0],0,[[0,1,0],[0,0,1]],false],
["Land_i_Barracks_V2_F",[23364.3,18683,0],0,[[0,1,0],[0,0,1]],false],
["Land_i_Barracks_V2_F",[23408.7,18682.4,0],0,[[0,1,0],[0,0,1]],false],
["Land_i_Barracks_V2_F",[23364.8,18723.1,0],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23465.8,18480.2,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23456.5,18480.4,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23447.3,18480.6,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23438,18480.8,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23428.8,18481,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23419.6,18481.3,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23410.3,18481.5,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23401.1,18481.7,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23391.9,18481.9,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23382.6,18482.2,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23373.4,18482.4,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23364.2,18482.6,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23354.9,18482.8,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23345.7,18483,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23346,18496.6,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23355.3,18496.3,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23364.5,18496,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23373.7,18495.7,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23383,18495.4,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23392.2,18495.1,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23401.4,18494.8,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23410.7,18494.5,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23419.9,18494.2,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23429.1,18493.9,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23438.4,18493.6,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23447.6,18493.3,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23456.8,18493.1,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_Cargo_House_V3_F",[23466.1,18492.8,0],1.81845,[[0.0317326,0.999496,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23466.1,18498,0],1.81814,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23471.7,18497.8,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23477.2,18497.7,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23486.1,18493.9,0],270.909,[[-0.999874,0.0158647,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23488.2,18497.3,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23493.7,18497.1,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23499.2,18497,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23504.7,18496.8,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23505.5,18496.7,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23485.9,18481.7,0],270.909,[[-0.999874,0.0158647,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23485.8,18476.1,0],270.909,[[-0.999874,0.0158647,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23479,18494,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23478.4,18482,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23478.2,18476.4,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23460.6,18498.2,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23455.1,18498.4,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23449.6,18498.5,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23444.1,18498.7,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23438.6,18498.9,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23433.1,18499.1,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23427.6,18499.2,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23422.1,18499.4,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23416.6,18499.6,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23411.1,18499.7,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23405.6,18499.9,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23400.1,18500.1,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23394.6,18500.3,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23389.1,18500.4,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23383.6,18500.6,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23378.1,18500.8,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23372.6,18501,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23367.1,18501.1,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23361.6,18501.3,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23356.1,18501.5,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23350.6,18501.7,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23345.1,18501.8,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23341.5,18499.9,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23341.1,18486.3,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23340.9,18480.7,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_Cargo_Patrol_V3_F",[23335.9,18481.8,0],0.909076,[[0.0158659,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23329.1,18481,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23329.1,18487.1,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23337.8,18488.4,0],2.27271,[[0.0396558,0.999213,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23205.4,18499.8,0],0.909088,[[0.0158659,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23209.9,18499.7,0],0.909088,[[0.0158659,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23214.5,18499.6,0],0.909088,[[0.0158659,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23219.7,18489.4,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23219.5,18483.8,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23219.9,18495,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23234.2,18483.4,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23234.4,18489,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23234.6,18494.6,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_ReservoirTank_Airport_F",[23307.7,18482.8,0],269.545,[[-0.999968,-0.00794067,0],[-0,0,1]],false],
["Land_Tank_rust_F",[23330.2,18853.7,0],90.909,[[0.999874,-0.0158643,0],[0,-0,1]],false],
["Land_ReservoirTower_F",[23509.8,18788.4,-0.021095],273.182,[[-0.998458,0.0555082,0],[0,0,1]],false],
["Land_i_Shed_Ind_F",[23280.7,18855.3,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_u_Shed_Ind_F",[23340.7,18854.7,0.0847158],270.455,[[-0.999968,0.00794117,0],[0,0,1]],false],
["Land_FieldToilet_F",[23515.4,18849.1,0],90.4545,[[0.999969,-0.0079325,0],[0,-0,1]],false],
["Land_Pallets_F",[23350.4,18870.7,0],0,[[0,1,0],[0,0,1]],false],
["Land_Pipes_large_F",[23347.3,18876.8,0],0,[[0,1,0],[0,0,1]],false],
["Land_EngineCrane_01_F",[23337.7,18864.1,0],345,[[-0.258819,0.965926,0],[0,0,1]],false],
["Land_Portable_generator_F",[23509.4,18838.8,0],268.182,[[-0.999497,-0.0317244,0],[-0,0,1]],false],
["Land_PortableLight_double_F",[23508.7,18840.6,0],336.238,[[-0.402944,0.915225,0],[0,0,1]],false],
["Land_WeldingTrolley_01_F",[23341.2,18863,0.0988188],39.0909,[[0.630553,0.776146,0],[0,0,1]],false],
["Land_MobileScafolding_01_F",[23346.6,18855.6,0],61.8182,[[0.881454,0.472271,0],[0,0,1]],false],
["Land_BagBunker_Small_F",[23513.5,18839.8,0],1.81815,[[0.0317273,0.999497,0],[0,0,1]],false],
["Land_BagFence_Long_F",[23515,18845.1,0],0,[[0,1,0],[0,0,1]],false],
["Land_BagFence_Long_F",[23512.3,18845.1,0],0,[[0,1,0],[0,0,1]],false],
["Land_BagFence_Long_F",[23510.6,18843.8,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_BagFence_Long_F",[23510.3,18838.7,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_BagFence_Long_F",[23514.7,18837.3,0],0.909101,[[0.0158659,0.999874,0],[0,0,1]],false],
["Land_BagFence_Long_F",[23511.5,18837.4,0],0.909088,[[0.0158659,0.999874,0],[0,0,1]],false],
["Land_Sign_WarningMilitaryArea_F",[23519.6,18835.1,-0.347955],270.909,[[-0.999874,0.0158647,0],[0,0,1]],false],
["Land_Sign_WarningMilitaryArea_F",[23519.4,18828.7,-0.368505],270.909,[[-0.999874,0.0158647,0],[0,0,1]],false],
["Land_LampAirport_F",[23515.4,18835.9,0],180.909,[[-0.0158645,-0.999874,0],[-0,0,1]],false],
["Land_LampAirport_F",[23204.2,18869,4.76837e-007],7.67708e-005,[[1.5979e-006,1,0],[0,0,1]],false],
["Land_LampHalogen_F",[23239.9,18480.9,0],333.636,[[-0.444072,0.895991,0],[0,0,1]],false],
["Land_LampHalogen_F",[23215.6,18482.8,0],213.636,[[-0.553915,-0.832573,0],[-0,0,1]],false],
["Land_i_Shed_Ind_F",[23307.6,18855,0.089165],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_Sign_WarningMilitaryArea_F",[23207.9,18882.8,-0.368505],177.389,[[0.0455562,-0.998962,0],[0,-0,1]],false],
["Land_HBarrierTower_F",[23201.2,18872.7,0],90.0001,[[1,-1.59343e-006,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23214.6,18873.6,0],1.81819,[[0.0317278,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23220.1,18873.4,0],1.81818,[[0.0317278,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23225.5,18873.3,0],1.36366,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23227.8,18867.6,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23227.7,18862.3,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23227.6,18856.6,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23207.1,18854.1,0],359.545,[[-0.00794099,0.999968,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23212.6,18854.1,0],359.545,[[-0.00794099,0.999968,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23218.2,18854.2,0],359.545,[[-0.00794099,0.999968,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23221.6,18854.2,0],359.545,[[-0.00794099,0.999968,0],[0,0,1]],false],
["Land_FieldToilet_F",[23205.3,18850.9,0],270.455,[[-0.999968,0.00794117,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23513.9,18852.9,0],0.909108,[[0.0158664,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23508.3,18853,0],0.909119,[[0.0158664,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23502.6,18853.1,0],0.909119,[[0.0158664,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23496.2,18871.4,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23496,18865.8,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23495.8,18860.2,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23495.7,18855.7,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_Wreck_Hunter_F",[23338,18860.7,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Wreck_Heli_Attack_01_F",[23279,18478,0],150.909,[[0.486198,-0.873849,0],[0,-0,1]],false],
["Land_CncBarrier_stripes_F",[23228.8,18448,0],343.182,[[-0.289332,0.957229,0],[0,0,1]],false],
["Land_Wreck_HMMWV_F",[23229.5,18446.4,0],214.091,[[-0.560509,-0.828148,0],[-0,0,1]],false],
["Land_Cargo_House_V2_ruins_F",[23280.9,18484.3,0],206.984,[[-0.477745,-0.861692,0.171015],[-0.0955405,0.244475,0.964937]],false],
["Land_Cargo_House_V2_ruins_F",[23270.9,18483.3,0.0219307],142.642,[[0.60362,-0.796888,0.0247735],[-0.134224,-0.0709437,0.988408]],false],
["Land_Cargo_House_V3_F",[23298.9,18484.2,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23291.1,18484.6,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23261.8,18485.6,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_House_V3_F",[23251.9,18485.9,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_Cargo_HQ_V3_F",[23294.1,18515.2,0],1.36364,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23236.8,18498.2,0],181.818,[[-0.0317247,-0.999497,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23242.4,18498,0],181.818,[[-0.0317247,-0.999497,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23248,18497.8,0],181.818,[[-0.0317247,-0.999497,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23253.6,18497.6,0],181.818,[[-0.0317247,-0.999497,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23259.2,18497.5,0],181.818,[[-0.0317247,-0.999497,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23264.8,18497.3,0],181.818,[[-0.0317247,-0.999497,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23270.4,18497.1,0],181.818,[[-0.0317247,-0.999497,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23272.5,18500.6,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23272.7,18506.2,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23272.9,18514.1,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23272.9,18517.4,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23273.1,18523,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23273.2,18528.6,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23273.3,18534.2,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23273.4,18539.9,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23273.6,18545.4,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23273.7,18551,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23273.9,18556.6,0],91.3638,[[0.999717,-0.0238007,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23205.8,18560.1,0],0.909221,[[0.015868,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23210.4,18560,0],0.90921,[[0.015868,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23216,18559.9,0],0.90921,[[0.015868,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23219.8,18559.8,0],0.90921,[[0.015868,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23244,18559.4,0],0.90921,[[0.015868,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23249.6,18559.3,0],0.90921,[[0.015868,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23255.3,18559.2,0],0.90921,[[0.015868,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23260.9,18559.2,0],0.90921,[[0.015868,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23266.5,18559.1,0],0.90921,[[0.015868,0.999874,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23271.3,18559,0],0.90921,[[0.015868,0.999874,0],[0,0,1]],false],
["Land_Crash_barrier_F",[23270.8,18503.6,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_Crash_barrier_F",[23271.2,18516.3,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_Crash_barrier_F",[23271.5,18528.5,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_Crash_barrier_F",[23271.9,18540.5,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_Crash_barrier_F",[23272.2,18551.1,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_Crash_barrier_F",[23265.6,18557.4,0],180.909,[[-0.0158645,-0.999874,0],[-0,0,1]],false],
["Land_Crash_barrier_F",[23252.3,18557.8,0],180.909,[[-0.0158645,-0.999874,0],[-0,0,1]],false],
["Land_Crash_barrier_F",[23240.3,18558,0],180.909,[[-0.0158645,-0.999874,0],[-0,0,1]],false],
["Land_Crash_barrier_F",[23218.9,18558.2,0],0.909119,[[0.0158664,0.999874,0],[0,0,1]],false],
["Land_Crash_barrier_F",[23208.5,18558.5,0],0.909076,[[0.0158659,0.999874,0],[0,0,1]],false],
["Land_BagBunker_Tower_F",[23237.6,18561.7,0],271.364,[[-0.999717,0.0238043,0],[0,0,1]],false],
["Land_BarGate_F",[23227.4,18559.3,0],1.81822,[[0.0317284,0.999497,0],[0,0,1]],false],
["Land_Wreck_Skodovka_F",[23266.5,18504,0],258.182,[[-0.978803,-0.204803,0],[-0,0,1]],false],
["Land_Wreck_Offroad2_F",[23267.3,18515.6,0],44.5455,[[0.701476,0.712694,0],[0,0,1]],false],
["Land_Wreck_Car3_F",[23269.8,18530.7,0],236.364,[[-0.832574,-0.553914,0],[-0,0,1]],false],
["Land_Wreck_Slammer_F",[23228.7,18511.6,0],50.4545,[[0.771119,0.636691,0],[0,0,1]],false],
["Land_Wreck_Truck_F",[23268.1,18537.2,0],275.455,[[-0.995471,0.0950639,0],[0,0,1]],false],
["Land_Wreck_HMMWV_F",[23218.7,18526.6,0],338.636,[[-0.364292,0.931285,0],[0,0,1]],false],
["Land_Wreck_Car2_F",[23230.6,18471.2,0],323.636,[[-0.592913,0.805266,0],[0,0,1]],false],
["Land_Wreck_Hunter_F",[23232.3,18548.5,0],300,[[-0.866025,0.5,0],[0,0,1]],false],
["Land_Wreck_Ural_F",[23251.3,18547.4,0],35.9091,[[0.586501,0.809949,0],[0,0,1]],false],
["Land_CncBarrier_F",[23222.5,18561.8,0],274.091,[[-0.997452,0.0713414,0],[0,0,1]],false],
["Land_CncBarrier_F",[23222.7,18564.4,0],274.091,[[-0.997452,0.0713414,0],[0,0,1]],false],
["Land_CncBarrier_F",[23222.9,18567,0],274.091,[[-0.997452,0.0713414,0],[0,0,1]],false],
["Land_CncBarrier_F",[23223.1,18569.6,0],274.091,[[-0.997452,0.0713414,0],[0,0,1]],false],
["Land_CncBarrier_F",[23223.2,18572.2,0],274.091,[[-0.997452,0.0713414,0],[0,0,1]],false],
["Land_CncBarrier_F",[23233.3,18565.9,0],274.091,[[-0.997452,0.0713414,0],[0,0,1]],false],
["Land_CncBarrier_F",[23233.5,18568.5,0],274.091,[[-0.997452,0.0713414,0],[0,0,1]],false],
["Land_CncBarrier_F",[23233.7,18571.1,0],274.091,[[-0.997452,0.0713414,0],[0,0,1]],false],
["Land_Crane_F",[23430.7,18856.1,0],2.27269,[[0.0396558,0.999213,0],[0,0,1]],false],
["Land_Cargo40_grey_F",[23452.6,18871.9,0],3.18186,[[0.0555053,0.998458,0],[0,0,1]],false],
["Land_Cargo40_light_green_F",[23439.8,18872.5,0],2.72729,[[0.0475823,0.998867,0],[0,0,1]],false],
["Land_Cargo40_red_F",[23464.8,18871.6,0],0.909076,[[0.0158659,0.999874,0],[0,0,1]],false],
["Land_Cargo40_sand_F",[23445.4,18872.4,2.71519],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_yellow_F",[23459.6,18871.5,2.67402],6.36364,[[0.110838,0.993838,0],[0,0,1]],false],
["Land_Cargo40_cyan_F",[23442.7,18856.3,0],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_brick_red_F",[23455,18856.3,0],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_brick_red_F",[23455,18856.3,2.62761],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_cyan_F",[23439,18855.5,18.2696],311.364,[[-0.750526,0.660841,0],[0,0,1]],false],
["Land_Cargo40_blue_F",[23442.8,18843.9,0],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_light_green_F",[23455.1,18843.9,0],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_blue_F",[23442.9,18843.9,2.58522],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_light_green_F",[23455.2,18843.9,2.55033],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_white_F",[23467.4,18856.3,0],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_yellow_F",[23467.4,18843.9,0],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_sand_F",[23467.4,18856.3,2.57376],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo40_light_blue_F",[23467.4,18843.9,2.60446],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo20_military_green_F",[23473.2,18866.4,0],38.1818,[[0.618159,0.786053,0],[0,0,1]],false],
["Land_Cargo20_vr_F",[23357.9,18757.4,0],54.5454,[[0.814576,0.580058,0],[0,0,1]],false],
["CargoNet_01_barrels_F",[23362.1,18751.3,0],0,[[0,1,0],[0,0,1]],false],
["CargoNet_01_box_F",[23367.5,18760.9,3.09637],0,[[0,1,0],[0,0,1]],false],
["Land_Medevac_house_V1_F",[23351.8,18767,0],273.182,[[-0.998458,0.0555082,0],[0,0,1]],false],
["Land_Medevac_HQ_V1_F",[23369,18762.4,0],270.455,[[-0.999968,0.00794117,0],[0,0,1]],false],
["Land_Medevac_house_V1_F",[23356.7,18780.1,0],317.273,[[-0.678506,0.734595,0],[0,0,1]],false],
["Land_Medevac_house_V1_F",[23380.4,18778.9,0],47.7272,[[0.739951,0.672661,0],[0,0,1]],false],
["Land_Dome_Big_F",[23370.3,18766.1,0],0,[[0,1,0],[0,0,1]],false],
["Land_Medevac_house_V1_F",[23382.6,18753.9,0],133.182,[[0.729184,-0.684318,0],[0,-0,1]],false],
["Land_HelipadCivil_F",[23267,18716.7,0],0,[[0,1,0],[0,0,1]],false],
["Land_Cargo_HQ_V1_F",[23212.6,18713.1,0],180.454,[[-0.00792385,-0.999969,0],[-0,0,1]],false],
["Land_Cargo_House_V1_F",[23206.9,18693.4,0],180,[[-8.74228e-008,-1,0],[-0,0,1]],false],
["Land_Cargo_House_V1_F",[23214.1,18693.4,0],180,[[-8.74228e-008,-1,0],[-0,0,1]],false],
["Land_Cargo_House_V1_F",[23221.3,18693.4,0],180,[[-8.74228e-008,-1,0],[-0,0,1]],false],
["Land_Cargo_House_V1_F",[23228.6,18693.4,0],180,[[-8.74228e-008,-1,0],[-0,0,1]],false],
["Land_Cargo_House_V1_F",[23207.1,18732.8,0],0.000134468,[[2.13053e-006,1,0],[0,0,1]],false],
["Land_Cargo_House_V1_F",[23214.4,18732.8,0],0.00012207,[[2.13053e-006,1,0],[0,0,1]],false],
["Land_Cargo_House_V1_F",[23221.6,18732.8,0],0.00012207,[[2.13053e-006,1,0],[0,0,1]],false],
["Land_Cargo_House_V1_F",[23228.9,18732.8,0],0.00012207,[[2.13053e-006,1,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23208,18687.6,0],0.909108,[[0.0158664,0.999874,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23216.7,18687.7,0],0.909119,[[0.0158664,0.999874,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23225.3,18687.8,0],0.909119,[[0.0158664,0.999874,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23233.3,18687.9,0],0.909119,[[0.0158664,0.999874,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23236.7,18693.1,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_HBarrierBig_F",[23236.7,18701.6,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_HBarrierBig_F",[23236.7,18710,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_HBarrierBig_F",[23236.3,18724.8,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_HBarrierBig_F",[23236.2,18733.3,0],91.8182,[[0.999497,-0.0317285,0],[0,-0,1]],false],
["Land_HBarrierBig_F",[23208,18738.6,0],180.909,[[-0.0158645,-0.999874,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23216.6,18738.7,0],180.909,[[-0.0158645,-0.999874,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23224.9,18738.6,0],180.909,[[-0.0158645,-0.999874,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23232.9,18738.7,0],180.909,[[-0.0158645,-0.999874,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23241.3,18721.5,0],181.818,[[-0.0317247,-0.999497,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23241.9,18713.2,0],181.818,[[-0.0317247,-0.999497,0],[-0,0,1]],false],
["Land_LampStadium_F",[23204.1,18721.4,0],180.455,[[-0.00794149,-0.999968,0],[-0,0,1]],false],
["Land_LampHalogen_F",[23235.4,18689.1,0],64.5454,[[0.902926,0.429796,0],[0,0,1]],false],
["Land_LampHalogen_F",[23235,18737.1,0],302.727,[[-0.841256,0.540637,0],[0,0,1]],false],
["Land_LampShabby_F",[23350.4,18718.1,0],222.727,[[-0.678506,-0.734595,0],[-0,0,1]],false],
["Land_LampShabby_F",[23394.2,18687,2.38419e-007],313.182,[[-0.729183,0.684318,0],[0,0,1]],false],
["Land_LampShabby_F",[23307.4,18687.4,0],315,[[-0.707107,0.707107,0],[0,0,1]],false],
["Land_LampSolar_F",[23336,18623.8,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_LampSolar_F",[23313.8,18593.9,0],91.8183,[[0.999496,-0.03173,0],[0,-0,1]],false],
["Land_LampSolar_F",[23392.5,18622.2,0],274.091,[[-0.997452,0.0713414,0],[0,0,1]],false],
["Land_LampSolar_F",[23369.8,18592.1,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["MetalBarrel_burning_F",[23493.9,18491.1,0],0,[[0,1,0],[0,0,1]],false],
["Land_BarrelWater_F",[23485,18491.3,0],0,[[0,1,0],[0,0,1]],false],
["Land_Box_AmmoOld_F",[23489,18482.3,0],315.455,[[-0.701469,0.7127,0],[0,0,1]],false],
["Land_TentDome_F",[23498.4,18494.8,0],271.818,[[-0.999497,0.0317249,0],[0,0,1]],false],
["Land_TablePlastic_01_F",[23490.3,18490,0],40.9091,[[0.654861,0.75575,0],[0,0,1]],false],
["Land_Sunshade_01_F",[23490.4,18490,0],0,[[0,1,0],[0,0,1]],false],
["Land_FieldToilet_F",[23204.5,18727.2,0],270.455,[[-0.999968,0.00794117,0],[0,0,1]],false],
["Land_FieldToilet_F",[23507,18502.1,0],90.455,[[0.999968,-0.00794156,0],[0,-0,1]],false],
["Land_MilOffices_V1_F",[23239.8,18784.4,2.38419e-007],359.545,[[-0.00794099,0.999968,0],[0,0,1]],false],
["Land_i_Shed_Ind_F",[23494.7,18711.4,0.0891647],0.454926,[[0.00793986,0.999968,0],[0,0,1]],false],
["Land_WIP_F",[23413,18828.9,0],181.364,[[-0.0238044,-0.999717,0],[-0,0,1]],false],
["Land_i_Shed_Ind_F",[23495.6,18747.6,0.0891647],0.454926,[[0.00793986,0.999968,0],[0,0,1]],false],
["Land_Wreck_CarDismantled_F",[23483.3,18765.2,0],77.7273,[[0.977147,0.212565,0],[0,0,1]],false],
["Land_Wreck_Skodovka_F",[23505.9,18738.8,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_Wreck_UAZ_F",[23503.6,18733.1,0],86.8182,[[0.998458,0.0555042,0],[0,0,1]],false],
["Land_Wreck_Heli_Attack_02_F",[23489,18730.5,0],52.7273,[[0.795762,0.605609,0],[0,0,1]],false],
["Land_Wreck_BMP2_F",[23481.9,18704.6,0],69.0909,[[0.934148,0.356887,0],[0,0,1]],false],
["Land_Wreck_Offroad_F",[23504.5,18725.1,0],132.727,[[0.734595,-0.678506,0],[0,-0,1]],false],
["Land_Wreck_Car3_F",[23509.5,18764.5,0],29.0909,[[0.486197,0.873849,0],[0,0,1]],false],
["Land_Wreck_Truck_F",[23495.9,18703.4,0],96.3636,[[0.993839,-0.110837,0],[0,-0,1]],false],
["Land_Wreck_Ural_F",[23481.7,18740,0],146.364,[[0.553915,-0.832573,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23511.8,18770.4,0],0,[[0,1,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23506.2,18770.4,0],0,[[0,1,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23500.6,18770.4,0],0,[[0,1,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23495,18770.4,0],0,[[0,1,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23489.4,18770.4,0],0,[[0,1,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23483.8,18770.4,0],0,[[0,1,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23478.2,18770.4,0],0,[[0,1,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23476.1,18766.8,0],90.4545,[[0.999969,-0.0079325,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23476.1,18761.2,0],90.4545,[[0.999969,-0.0079325,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23476,18744.4,0],90.4545,[[0.999969,-0.0079325,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23475.9,18738.8,0],90.4545,[[0.999969,-0.0079325,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23475.9,18733.2,0],90.4545,[[0.999969,-0.0079325,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23475.8,18727.6,0],90.4545,[[0.999969,-0.0079325,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23475.7,18710.8,0],90.4545,[[0.999969,-0.0079325,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23475.6,18705.2,0],90.4545,[[0.999969,-0.0079325,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23475.6,18699.5,0],90.4545,[[0.999969,-0.0079325,0],[0,-0,1]],false],
["Land_HBarrier_5_F",[23479.2,18697.5,0],1.36363,[[0.0237974,0.999717,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23484.8,18697.4,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23490.4,18697.2,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23496,18697.1,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23501.6,18697,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23507.2,18696.8,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23510.1,18696.8,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23277,18536.2,0],1.50775,[[0.0263122,0.999654,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23282.6,18536.1,0],1.50775,[[0.0263122,0.999654,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23288.2,18535.9,0],1.50775,[[0.0263122,0.999654,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23289.4,18535.8,0],1.50775,[[0.0263122,0.999654,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23299.4,18535.6,0],1.50775,[[0.0263122,0.999654,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23305,18535.5,0],1.50775,[[0.0263122,0.999654,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23310.6,18535.3,0],1.50775,[[0.0263122,0.999654,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23312.6,18531.7,0],272.417,[[-0.99911,0.0421723,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23312.3,18526.1,0],272.417,[[-0.99911,0.0421723,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23312.1,18520.5,0],272.417,[[-0.99911,0.0421723,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23311.8,18514.9,0],272.417,[[-0.99911,0.0421723,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23311.6,18509.3,0],272.417,[[-0.99911,0.0421723,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23335.7,18502,0],181.053,[[-0.0183775,-0.999831,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23330.1,18502.1,0],181.053,[[-0.0183775,-0.999831,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23324.4,18502.2,0],181.053,[[-0.0183775,-0.999831,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23318.8,18502.3,0],181.053,[[-0.0183775,-0.999831,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23313.2,18502.4,0],181.053,[[-0.0183775,-0.999831,0],[-0,0,1]],false],
["Land_HBarrier_5_F",[23311.4,18505.6,0],272.417,[[-0.99911,0.0421723,0],[0,0,1]],false],
["Land_HBarrierWall_corridor_F",[23294.5,18537.9,0],91.3636,[[0.999717,-0.023797,0],[0,-0,1]],false],
["Land_Cargo_Patrol_V3_F",[23289.3,18540.3,0],92.2727,[[0.999213,-0.0396559,0],[0,-0,1]],false],
["Land_CinderBlocks_F",[23204.8,18602.8,0],1.36364,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23204.8,18603.8,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23204.9,18604.9,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23204.9,18605.9,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23204.9,18606.9,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23204.9,18608,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23205,18609,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23205,18610,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23205,18611.1,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23205,18612.1,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23205.1,18613.1,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23205.1,18614.2,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23205.1,18615.2,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23205.1,18616.2,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.4,18616.2,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.3,18615.2,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.3,18614.1,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.3,18613.1,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.3,18612.1,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.2,18611,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.2,18610,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.2,18609,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.2,18607.9,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.1,18606.9,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.1,18605.9,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.1,18604.8,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206.1,18603.8,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_CinderBlocks_F",[23206,18602.8,0],1.36365,[[0.0237979,0.999717,0],[0,0,1]],false],
["Land_ConcretePipe_F",[23207.7,18593.4,0],351.364,[[-0.150156,0.988662,0],[0,0,1]],false],
["Land_ConcretePipe_F",[23206.1,18581.6,-2.38419e-007],76.3636,[[0.971811,0.23576,0],[0,0,1]],false],
["Land_ConcretePipe_F",[23213.6,18595.7,-2.38419e-007],24.5454,[[0.415414,0.909632,0],[0,0,1]],false],
["Land_ConcretePipe_F",[23213.1,18608.8,-2.38419e-007],62.7272,[[0.888835,0.458228,0],[0,0,1]],false],
["Land_ConcretePipe_F",[23217.9,18626,-2.38419e-007],359.091,[[-0.015864,0.999874,0],[0,0,1]],false],
["Land_ConcretePipe_F",[23221,18607,-2.38419e-007],21.3636,[[0.364285,0.931288,0],[0,0,1]],false],
["Land_ConcretePipe_F",[23212.8,18634.1,-2.38419e-007],67.7273,[[0.92539,0.379015,0],[0,0,1]],false],
["Land_Coil_F",[23211.6,18621.5,0],0,[[0,1,0],[0,0,1]],false],
["Land_Coil_F",[23216.5,18586.2,0],0,[[0,1,0],[0,0,1]],false],
["Land_Coil_F",[23222.7,18596.2,0],0,[[0,1,0],[0,0,1]],false],
["Land_Pipes_large_F",[23207.5,18588.2,0],0,[[0,1,0],[0,0,1]],false],
["Land_Pipes_large_F",[23207.5,18587,0],0,[[0,1,0],[0,0,1]],false],
["Land_Pipes_large_F",[23207.5,18585.9,0],0,[[0,1,0],[0,0,1]],false],
["Land_Timbers_F",[23205.7,18636.4,0],0,[[0,1,0],[0,0,1]],false],
["Land_LampSolar_F",[23289,18509.3,0],21.3636,[[0.364285,0.931288,0],[0,0,1]],false],
["Land_LampShabby_F",[23232.9,18558.8,0],265.455,[[-0.996855,-0.079242,0],[-0,0,1]],false],
["Land_Cargo40_yellow_F",[23507.1,18536.8,0],91.3637,[[0.999717,-0.023799,0],[0,-0,1]],false],
["Land_Cargo40_red_F",[23506.8,18524.5,0],91.3637,[[0.999717,-0.023799,0],[0,-0,1]],false],
["Land_Cargo40_light_blue_F",[23507.1,18524.8,2.5908],87.2728,[[0.998867,0.0475806,0],[0,0,1]],false],
["Land_Cargo40_military_green_F",[23507.2,18537.4,2.59217],91.8181,[[0.999497,-0.0317269,0],[0,-0,1]],false],
["Land_Cargo20_blue_F",[23507.9,18512.2,0.0176594],136.269,[[0.691269,-0.722598,0],[0,-0,1]],false],
["Land_Cargo40_sand_F",[23507.3,18510.5,2.57103],55.9091,[[0.828149,0.560508,0],[0.0417925,-0.0617483,0.997216]],false],
["Land_Wreck_Hunter_F",[23506.6,18516.3,-0.492616],290.909,[[-0.910493,0.347848,0.223618],[0.208892,-0.0798058,0.974677]],false],
["Land_Wreck_Offroad2_F",[23418.7,18533.1,0],217.273,[[-0.605614,-0.795759,0],[-0,0,1]],false],
["Land_Wreck_HMMWV_F",[23342.3,18534.6,0],130,[[0.766044,-0.642788,0],[0,-0,1]],false],
["Land_Wreck_Ural_F",[23337.9,18580,0.188128],133.636,[[0.742209,-0.650054,-0.16296],[-0.0469336,-0.292984,0.954965]],false],
["Land_Barracks_ruins_F",[23325.3,18586.9,0],182.727,[[-0.0475774,-0.998868,0],[-0,0,1]],false],
["Land_Wreck_BRDM2_F",[23375.1,18514,0],0,[[0,1,0],[0,0,1]],false],
["Land_Wreck_HMMWV_F",[23271.6,18583.8,0],130,[[0.766044,-0.642788,0],[0,-0,1]],false],
["Land_Wreck_Truck_F",[23249.7,18634.9,0],289.091,[[-0.945,0.32707,0],[0,0,1]],false],
["Land_Wreck_Offroad2_F",[23270.2,18627.9,0],44.5455,[[0.701476,0.712694,0],[0,0,1]],false],
["Land_Wreck_Skodovka_F",[23263.8,18665.4,0],155.455,[[0.415408,-0.909635,0],[0,-0,1]],false],
["Land_Cargo20_grey_F",[23496.8,18505.3,-0.11775],309.545,[[-0.0132614,0.0109493,0.999852],[0.771011,-0.63659,0.0171974]],false],
["Land_UWreck_MV22_F",[23478.6,18573.4,0],230,[[-0.766045,-0.642788,0],[-0,0,1]],false],
["Land_spp_Mirror_ruins_F",[23486.1,18582.5,-0.592143],175.909,[[0.23313,-0.906378,0.352321],[0.367186,0.417531,0.831169]],false],
["Land_spp_Mirror_ruins_F",[23485.8,18578.2,0],224.091,[[-0.6958,-0.718235,0],[-0,0,1]],false],
["Land_spp_Mirror_ruins_F",[23485.6,18573.8,-0.765256],222.273,[[-0.573014,-0.630331,0.523773],[0.352323,0.387565,0.851858]],false],
["Land_spp_Mirror_ruins_F",[23474.5,18576.5,-0.947617],151.818,[[0.253162,-0.911687,-0.323629],[0.620622,-0.103566,0.77724]],false],
["Land_spp_Mirror_ruins_F",[23468.8,18573.5,0],183.182,[[-0.0555083,-0.998458,0],[-0,0,1]],false],
["Land_spp_Mirror_ruins_F",[23478.5,18579.2,-0.483662],183.182,[[0.211824,-0.851539,0.479596],[0.427774,0.522011,0.737912]],false],
["Land_HBarrierBig_F",[23202.4,18699.4,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.4,18708.1,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.4,18716.9,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.3,18725.6,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.3,18734.3,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.3,18743.1,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.3,18751.8,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.3,18760.5,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.2,18769.2,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.2,18778,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.2,18786.7,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.2,18795.4,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.2,18804.2,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.1,18812.9,2.38419e-007],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.1,18821.6,4.76837e-007],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.1,18830.3,4.76837e-007],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.1,18839.1,4.76837e-007],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.1,18847.8,4.76837e-007],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202,18856.5,4.76837e-007],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202,18865.3,4.76837e-007],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23210.8,18881.6,4.76837e-007],181.627,[[-0.0283974,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23202.2,18878.2,4.76837e-007],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23209.2,18873.8,0],1.81818,[[0.0317278,0.999497,0],[0,0,1]],false],
["Land_HBarrier_5_F",[23204,18874,0],1.81818,[[0.0317278,0.999497,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23219.3,18881.3,4.76837e-007],181.627,[[-0.0283981,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23227.8,18881.1,4.76837e-007],181.627,[[-0.0283984,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23236.3,18880.8,4.76837e-007],181.627,[[-0.0283988,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23244.9,18880.6,4.76837e-007],181.627,[[-0.0283991,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23253.4,18880.4,4.76837e-007],181.627,[[-0.0283993,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23261.9,18880.1,4.76837e-007],181.627,[[-0.0283998,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23270.4,18879.9,4.76837e-007],181.627,[[-0.0284005,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23279,18879.6,4.76837e-007],181.627,[[-0.0284007,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23287.5,18879.4,4.76837e-007],181.627,[[-0.028401,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23296,18879.1,4.76837e-007],181.627,[[-0.0284015,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23304.5,18878.9,4.76837e-007],181.628,[[-0.0284017,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23313.1,18878.7,4.76837e-007],181.628,[[-0.0284022,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23321.6,18878.4,4.76837e-007],181.628,[[-0.0284029,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23330.1,18878.2,4.76837e-007],181.628,[[-0.0284031,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23338.6,18877.9,4.76837e-007],181.628,[[-0.0284034,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23347.2,18877.7,4.76837e-007],181.628,[[-0.0284038,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23355.7,18877.4,4.76837e-007],181.628,[[-0.0284041,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23364.2,18877.2,4.76837e-007],181.628,[[-0.0284046,-0.999597,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23372.7,18877,4.76837e-007],181.628,[[-0.0284053,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23381.3,18876.7,4.76837e-007],181.628,[[-0.0284055,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23389.8,18876.5,4.76837e-007],181.628,[[-0.0284057,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23398.3,18876.2,4.76837e-007],181.628,[[-0.0284062,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23406.8,18876,4.76837e-007],181.628,[[-0.0284065,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23415.4,18875.8,4.76837e-007],181.628,[[-0.0284069,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23423.9,18875.5,4.76837e-007],181.628,[[-0.0284072,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23432.4,18875.3,4.76837e-007],181.628,[[-0.0284074,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23440.9,18875,4.76837e-007],181.628,[[-0.0284079,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23449.5,18874.8,4.76837e-007],181.628,[[-0.0284081,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23458.2,18874.6,4.76837e-007],181.628,[[-0.0284086,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23466.5,18874.3,4.76837e-007],181.628,[[-0.0284093,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23475,18874.1,4.76837e-007],181.628,[[-0.0284096,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23483.6,18873.8,4.76837e-007],181.628,[[-0.0284098,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23492.1,18873.6,4.76837e-007],181.628,[[-0.0284103,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23500.6,18873.3,4.76837e-007],181.628,[[-0.0284105,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23509.1,18873.1,4.76837e-007],181.628,[[-0.028411,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23515.2,18873.3,4.76837e-007],181.628,[[-0.0284117,-0.999596,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23518.7,18868.2,4.76837e-007],271.389,[[-0.999706,0.0242353,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23518.5,18859.6,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23518.2,18851.1,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23518,18842.6,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23518.1,18837.9,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23517.6,18825.5,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23517.4,18817,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23517.2,18808.5,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23517,18799.9,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23516.8,18791.4,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23516.6,18782.9,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23516.4,18774.3,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23516.2,18765.8,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23516,18757.3,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23515.8,18748.8,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23515.6,18740.2,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23515.3,18731.7,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23515.1,18723.2,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23514.9,18714.7,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23514.7,18706.1,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23514.5,18697.6,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23514.3,18689.1,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23514.1,18680.5,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23513.9,18672,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23513.7,18663.5,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23513.5,18655,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23513.3,18646.4,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23513.1,18637.9,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23512.9,18629.4,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23512.7,18620.9,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23512.5,18612.3,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23512.2,18603.8,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23512,18595.3,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23511.8,18586.7,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23511.6,18578.2,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23511.4,18569.7,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23511.2,18561.2,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23512.9,18828.6,4.76837e-007],358.756,[[-0.0217138,0.999764,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23507.7,18831.5,4.76837e-007],274.181,[[-0.997338,0.0729128,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23511,18552.6,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23510.8,18544.1,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23510.6,18535.6,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23510.4,18527.1,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23511.2,18518.5,4.76837e-007],256.229,[[-0.971256,-0.238039,0],[-0,0,1]],false],
["Land_HBarrierBig_F",[23510.1,18511.1,4.76837e-007],317.266,[[-0.67859,0.734517,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23509.7,18502.3,4.76837e-007],278.57,[[-0.988836,0.14901,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23509.4,18477.2,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23509.4,18485.5,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23509.3,18493.8,4.76837e-007],271.389,[[-0.999706,0.0242357,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23506.3,18471.9,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23497.8,18472.2,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23489.3,18472.4,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23480.7,18472.6,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23472.2,18472.9,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23463.7,18473.1,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23455.1,18473.3,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23446.6,18473.6,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23438.1,18473.8,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23429.6,18474,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23421,18474.3,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23412.5,18474.5,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23404,18474.7,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23395.5,18474.9,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23386.9,18475.2,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23378.4,18475.4,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23369.9,18475.6,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23361.4,18475.9,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23352.8,18476.1,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23344.3,18476.3,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23335.8,18476.6,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23327.3,18476.8,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23318.7,18477,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23310.2,18477.2,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23301.7,18477.5,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23293.2,18477.7,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23284.6,18477.9,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23243.7,18478.9,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23252.1,18478.8,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23260.5,18478.6,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23269,18478.6,4.76837e-007],1.54828,[[0.0270193,0.999635,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.4,18690.9,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.4,18682.4,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.4,18673.8,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.5,18665.3,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.5,18656.8,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.5,18648.2,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.5,18639.7,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.5,18631.2,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.6,18622.7,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.6,18614.1,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.6,18605.6,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.6,18597.1,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.6,18588.5,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.7,18580,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.7,18571.5,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.7,18562.9,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.7,18554.4,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.7,18545.9,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.8,18537.4,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.8,18528.8,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.8,18520.3,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.8,18511.8,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.8,18503.2,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.9,18494.7,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23202.9,18486.2,0],89.8719,[[0.999997,0.00223477,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23206.1,18481.3,0],2.90385,[[0.0506604,0.998716,0],[0,0,1]],false],
["Land_HBarrierBig_F",[23209.4,18481.2,0],180.43,[[-0.00751282,-0.999972,0],[-0,0,1]],false]
];

View File

@ -18,7 +18,6 @@ if (!DMS_ai_offload_to_client && {isNull DMS_HC_Object}) exitWith {};
{
if (isNull DMS_HC_Object) then
{
if (DMS_DEBUG) then
{
(format ["AILocalityManager :: DMS_HC_Object is null! Finding owner for group: %1",_group]) call DMS_fnc_DebugLog;

View File

@ -40,8 +40,8 @@
[_crate2,_crate_loot_values2]
]
],
[_msgWIN,_msgLose],
[_missionName,_markerDot,_markerCircle],
[_missionName,_msgWIN,_msgLose],
[_markerDot,_markerCircle],
_side,
_difficulty,
_missionEvents,
@ -85,6 +85,11 @@ _onEndingScripts = if ((count _this)>10) then {_this select 10} else {[[],[]]};
try
{
if ((count _pos) isEqualTo 2) then
{
_pos set [2,0];
};
if (_completionInfo isEqualTo []) then
{
throw "_completionInfo is empty!";
@ -96,23 +101,7 @@ try
["_timeUntilFail",DMS_MissionTimeOut call DMS_fnc_SelectRandomVal,[0]]
];
_units = [];
{
if (((typeName _x) == "OBJECT") && {!isNull _x}) then
{
_units pushBack _x;
}
else
{
if (((typeName _x) == "GROUP") && {!isNull _x}) then
{
{
_units pushBack _x;
} forEach (units _x);
};
};
} forEach _inputUnits;
_units = _inputUnits call DMS_fnc_GetAllUnits;
_OK = _missionObjs params
[

View File

@ -0,0 +1,226 @@
/*
DMS_fnc_AddMissionToMonitor_Static
Created by eraser1
Parses and adds mission information to "DMS_Mission_Arr" for Mission Monitoring.
Usage:
[
_position,
[
[
_completionType1,
_completionArgs1
],
[
_completionType2,
_completionArgs3
],
...
[
_completionTypeN,
_completionArgsN
],
],
[
_groupReinforcementsInfo1,
_groupReinforcementsInfo2,
...,
_groupReinforcementsInfoN
],
[
_timeStarted,
_timeUntilFail
],
[
_AIUnitOrGroup1,
_AIUnitOrGroup2,
...,
_AIUnitOrGroupN
],
[
[_cleanupObj1,_cleanupObj2,...,_cleanupObjX],
[_vehicle1,_vehicle2,...,_vehicleX],
[
[_crate1,_crate_loot_values1],
[_crate2,_crate_loot_values2]
]
],
[
_missionName,
_msgWIN,
_msgLose
],
[_markerDot,_markerCircle],
_side,
_difficulty,
_missionEvents,
[
_onSuccessScripts, // (OPTIONAL) Array of code or string to be executed on mission completion (in addition to regular code).
_onFailScripts // (OPTIONAL) Array of code or stirng to be executed on mission failure (in addition to regular code).
]
] call DMS_fnc_AddMissionToMonitor_Static;
Returns whether or not info was added successfully
*/
private ["_added", "_OK", "_pos", "_onEndingScripts", "_completionInfo", "_timeOutInfo", "_units", "_inputUnits", "_missionObjs", "_mines", "_difficulty", "_side", "_messages", "_markers", "_arr", "_timeStarted", "_timeUntilFail", "_buildings", "_vehs", "_crate_info_array", "_missionName", "_msgWIN", "_msgLose", "_markerDot", "_markerCircle", "_missionEvents", "_onSuccessScripts", "_onFailScripts"];
_added = false;
_OK = params
[
["_pos","",[[]],[2,3]],
["_completionInfo","",[[]]],
["_groupReinforcementsInfo","",[[]]],
["_timeOutInfo","",[[]],[1,2]],
["_inputUnits","",[[]]],
["_missionObjs","",[[]],[3,4]],
["_messages","",[[]],[3]],
["_markers","",[[]],[2]],
["_side","bandit",[""]],
["_difficulty","moderate",[""]],
["_missionEvents",[],[[]]]
];
if (!_OK) exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_AddMissionToMonitor_Static with invalid parameters: %1",_this];
false;
};
_onEndingScripts = if ((count _this)>10) then {_this select 10} else {[[],[]]};
try
{
if ((count _pos) isEqualTo 2) then
{
_pos set [2,0];
};
if (_completionInfo isEqualTo []) then
{
throw "_completionInfo is empty!";
};
_timeOutInfo params
[
["_timeStarted",diag_tickTime,[0]],
["_timeUntilFail",DMS_MissionTimeOut call DMS_fnc_SelectRandomVal,[0]]
];
_OK = _missionObjs params
[
["_buildings","",[[]]],
["_vehs","",[[]]],
["_crate_info_array","",[[]]]
];
if (!_OK) then
{
throw format["_missionObjs |%1|",_missionObjs];
};
_mines = [];
if ((count _missionObjs)>3) then
{
_mines = _missionObjs param [3,[],[[]]];
};
// Don't spawn a minefield if there is one already defined in _missionObjs.
if (DMS_SpawnMinefieldForEveryMission && {_mines isEqualTo []}) then
{
_mines = [_pos, _difficulty, _side] call DMS_fnc_SpawnMinefield;
};
_OK = _messages params
[
["_missionName","",[""]],
["_msgWIN",[],[[]],[2]],
["_msgLose",[],[[]],[2]]
];
if (!_OK) then
{
throw format["_messages |%1|",_messages];
};
_OK = _markers params
[
["_markerDot","",[""]],
["_markerCircle","",[""]]
];
if (!_OK) then
{
throw format["_markers |%1|",_markers];
};
_OK = _onEndingScripts params
[
["_onSuccessScripts", [], [[]]],
["_onFailScripts", [], [[]]]
];
if (!_OK) then
{
throw format["_onEndingScripts |%1|",_onEndingScripts];
};
_arr =
[
_pos,
_completionInfo,
_groupReinforcementsInfo,
[
_timeStarted,
_timeUntilFail
],
_inputUnits,
[
_buildings,
_vehs,
_crate_info_array,
_mines
],
[
_missionName,
_msgWIN,
_msgLose
],
[
_markerDot,
_markerCircle
],
_side,
_difficulty,
_missionEvents,
[
_onSuccessScripts,
_onFailScripts
]
];
DMS_StaticMission_Arr pushBack _arr;
_added = true;
if (DMS_MarkerText_ShowAICount) then
{
_markerDot setMarkerText (format ["%1 (%2 %3 remaining)",markerText _markerDot,count (_inputUnits call DMS_fnc_GetAllUnits),DMS_MarkerText_AIName]);
};
if (DMS_DEBUG) then
{
(format ["AddMissionToMonitor_Static :: Added |%1| to DMS_StaticMission_Arr!",_arr]) call DMS_fnc_DebugLog;
};
}
catch
{
diag_log format ["DMS ERROR :: Calling DMS_AddMissionToMonitor_Static with invalid parameter: %1",_exception];
};
_added

View File

@ -51,7 +51,7 @@ if ((typeName _message) != "STRING") then
{
case "systemchatrequest":
{
[_x, [format ["%1: %2",toUpper _missionName,_message]]] call ExileServer_system_network_send_broadcast;
[_x, [format ["%1: %2",toUpper _missionName,_message]], "-1"] call ExileServer_system_network_send_broadcast;
};
case "standardhintrequest":
@ -71,7 +71,8 @@ if ((typeName _message) != "STRING") then
DMS_standardHint_Message_Font,
_message
]
]
],
"-1"
] call ExileServer_system_network_send_broadcast;
};

View File

@ -15,7 +15,10 @@
*/
(format ["CleanUp :: CLEANING UP: %1",_this]) call DMS_fnc_DebugLog;
if (DMS_DEBUG) then
{
(format ["CleanUp :: CLEANING UP: %1",_this]) call DMS_fnc_DebugLog;
};
if !((typeName _this) == "ARRAY") then
{
@ -59,7 +62,10 @@ _clean =
else
{
_skippedObjects pushBack _x;
(format ["CleanUp :: Skipping cleanup for |%1|, player within %2 meters!",_x,DMS_CleanUp_PlayerNearLimit]) call DMS_fnc_DebugLog;
if (DMS_DEBUG) then
{
(format ["CleanUp :: Skipping cleanup for |%1|, player within %2 meters!",_x,DMS_CleanUp_PlayerNearLimit]) call DMS_fnc_DebugLog;
};
};
}
else
@ -85,7 +91,10 @@ _clean =
};
if ((typeName _x) == "ARRAY") exitWith
{
(format ["CleanUp :: Doing recursive call for ARRAY: %1",_x]) call DMS_fnc_DebugLog;
if (DMS_DEBUG) then
{
(format ["CleanUp :: Doing recursive call for ARRAY: %1",_x]) call DMS_fnc_DebugLog;
};
_x call DMS_fnc_CleanUp;
};
diag_log format ["DMS ERROR :: Attempted to call DMS_fnc_CleanUp on non- group or object %1 from array %2",_x,_this];

View File

@ -42,6 +42,7 @@ if (DMS_CleanUpList isEqualTo []) exitWith {}; // Empty array, no objects to cl
if ((diag_tickTime-_timeAddedToList)>=_timeUntilClean) then
{
_objs call DMS_fnc_CleanUp;
DMS_CleanUpList deleteAt _forEachIndex;
}
else
{

View File

@ -54,6 +54,12 @@ switch (_difficulty) do
default {_color = _difficulty;};
};
if !((toLower _color) in DMS_A3_AllMarkerColors) then
{
diag_log format ["DMS ERROR :: Color ""%1"" is not a valid marker color! Switching to ""ColorRed""",_color];
_color = "ColorRed";
};
_circle = createMarker [format ["DMS_MissionMarkerCircle%1",_num], _pos];
_circle setMarkerColor _color;
_circle setMarkerShape "ELLIPSE";

View File

@ -9,6 +9,6 @@
If you have infiSTAR's DLLs, then it will also utilize the "ARMA_LOG" dll to write debug info.
*/
_this = format ["%1 |::|::| (UpTime: %2 | %3 FPS)",_this,time,diag_fps];
_this = format ['%1 |::|::| (DMS_Version: "%4" | time: %2 | diag_tickTime: %5 | %3 FPS)',_this,time,diag_fps,DMS_Version,diag_tickTime];
"ARMA_LOG" callExtension format ["DMS_DEBUG:%1",_this];
diag_log format ["DMS_DEBUG :: %1",_this];

View File

@ -11,9 +11,9 @@
_rareLootChance // (OPTIONAL) NUMBER: Manually define the percentage chance of spawning some rare items.
] call DMS_fnc_FillCrate;
Loot values can be a number or a string with a corresponding "Crate Case" defined in the config. EG: DMS_CrateCase_Sniper. Or it can be an array.
If the "_lootValues" parameter is a number or a string, the function will look for a value defined as "DMS_CrateCase_*", where the "*" is replaced by the "_lootValues" parameter. EG: DMS_CrateCase_Sniper.
In the array, the loot values are defined as:
Otherwise, the "_lootValues" parameter must be defined as:
[
_weapons,
_items,
@ -24,6 +24,36 @@
For example, _weapons could simply be a number, in which case the given number of weapons are selected from "DMS_boxWeapons",
or an array as [_wepCount,_weps], where _wepCount is the number of weapons, and _weps is an array of weapons from which the guns are randomly selected.
OR:
[
_customLootFunctionParams,
_customLootFunction
]
In this case, "_customLootFunctionParams" is passed to "_customLootFunction", and the custom loot function must return the loot in the form:
[
[
weapon1,
weapon2,
[weapon_that_appears_twice,2],
...
weaponN
],
[
item1,
item2,
[item_that_appears_5_times,5],
...
itemN
],
[
backpack1,
backpack2,
[backpack_that_appears_3_times,3],
...
backpackN
]
]
*/
private ["_crate","_lootValues","_wepCount","_weps","_itemCount","_items","_backpackCount","_backpacks","_weapon","_ammo","_item","_backpack","_crateValues","_rareLootChance","_marker"];
@ -49,7 +79,7 @@ if !(DMS_GodmodeCrates) then
_crate hideObjectGlobal false;
if ((typeName _lootValues)=="ARRAY") then
if (((typeName _lootValues)=="ARRAY") && {(typeName (_lootValues select 1))!="CODE"}) then
{
// Weapons
if(typeName (_lootValues select 0) == "ARRAY") then
@ -144,7 +174,26 @@ if ((typeName _lootValues)=="ARRAY") then
}
else
{
_crateValues = missionNamespace getVariable [ format ["DMS_CrateCase_%1",_lootValues], [[], [], []] ];
_crateValues =
if ((typeName _lootValues)=="ARRAY") then
{
(_lootValues select 0) call (_lootValues select 1)
}
else
{
missionNamespace getVariable (format ["DMS_CrateCase_%1",_lootValues])
};
if !(_crateValues params
[
["_weps", [], [[]]],
["_items", [], [[]]],
["_backpacks", [], [[]]]
])
exitWith
{
diag_log format ["DMS ERROR :: Invalid ""_crateValues"" (%1) generated from _lootValues: %2",_crateValues,_lootValues];
};
// Weapons
{
@ -153,7 +202,7 @@ else
_x = [_x,1];
};
_crate addWeaponCargoGlobal _x;
} forEach (_crateValues select 0);
} forEach _weps;
// Items/Mags
{
@ -162,7 +211,7 @@ else
_x = [_x,1];
};
_crate addItemCargoGlobal _x;
} forEach (_crateValues select 1);
} forEach _items;
// Backpacks
{
@ -171,17 +220,21 @@ else
_x = [_x,1];
};
_crate addBackpackCargoGlobal _x;
} forEach (_crateValues select 2);
} forEach _backpacks;
};
if(DMS_RareLoot && {count DMS_RareLootList>0}) then
{
_rareLootChance = DMS_RareLootChance;
if ((count _this)>2) then
{
_rareLootChance = param [2,DMS_RareLootChance,[0]];
};
_rareLootChance =
if ((count _this)>2) then
{
_this param [2,DMS_RareLootChance,[0]]
}
else
{
DMS_RareLootChance
};
// (Maybe) Add rare loot
if(random 100 < _rareLootChance) then

View File

@ -21,7 +21,7 @@
*/
private ["_nearestObjectMinDistance", "_waterNearLimit", "_minSurfaceNormal", "_spawnZoneNearLimit", "_traderZoneNearLimit", "_missionNearLimit", "_playerNearLimit", "_territoryNearLimit", "_throttleParams", "_waterSpawn", "_isValidSpot", "_attempts", "_pos"];
private ["_nearestObjectMinDistance", "_waterNearLimit", "_minSurfaceNormal", "_spawnZoneNearLimit", "_traderZoneNearLimit", "_missionNearLimit", "_playerNearLimit", "_territoryNearLimit", "_throttleParams", "_waterSpawn", "_isValidSpot", "_attempts", "_pos", "_restriction", "_generatePos", "_presetLocs", "_presetLocsLength"];
params
[
@ -43,16 +43,36 @@ _isValidSpot = false;
_attempts = 0;
_restriction = if (_waterSpawn) then {2} else {0};
_presetLocsLength = 0;
if (DMS_UsePredefinedMissionLocations) then
{
// Shuffle the array so that the positions are selected in random order
_presetLocs = ([] + DMS_PredefinedMissionLocations) call ExileClient_util_array_shuffle;
_presetLocsLength = count _presetLocs;
};
_generatePos =
{
if (DMS_UsePredefinedMissionLocations && {_attempts<=_presetLocsLength}) then
{
_presetLocs select (_attempts - 1)
}
else
{
[DMS_MinMax_X_Coords call DMS_fnc_SelectRandomVal,DMS_MinMax_Y_Coords call DMS_fnc_SelectRandomVal] isFlatEmpty [_nearestObjectMinDistance, 0, 9999, 1, _restriction, _waterSpawn, objNull]
};
};
while{!_isValidSpot} do
{
_attempts = _attempts+1;
_pos = ([DMS_MapCenterPos,random DMS_MapRadius,random 360] call DMS_fnc_SelectOffsetPos) isFlatEmpty [_nearestObjectMinDistance, 0, 9999, 1, _restriction, _waterSpawn, objNull];
_pos = [];
while {_pos isEqualTo []} do
{
_pos = ([DMS_MapCenterPos,random DMS_MapRadius,random 360] call DMS_fnc_SelectOffsetPos) isFlatEmpty [_nearestObjectMinDistance, 0, 9999, 1, _restriction, _waterSpawn, objNull];
_pos = call _generatePos;
};

View File

@ -0,0 +1,72 @@
/*
DMS_fnc_GetAllUnits
Created by eraser1
Usage:
[
_unitOrGroupOrArray1,
_unitOrGroupOrArray2,
...
_unitOrGroupOrArrayN
] call DMS_fnc_GetAllUnits;
Returns all living units from a given array of groups or objects.
*/
private ["_units"];
if ((typeName _this)!="ARRAY") then
{
_this = [_this];
};
_units = [];
{
private ["_parameter", "_tN"];
_parameter = _x;
_tN = typeName _parameter;
if (_tN == "ARRAY") then
{
_units append (_parameter call DMS_fnc_GetAllUnits);
}
else
{
if (_tN in ["OBJECT", "GROUP"]) then
{
if (!isNull _parameter) then
{
if (_tN == "OBJECT") then
{
if (alive _parameter) then
{
_units pushBack _parameter;
};
}
else
{
{
if (alive _x) then
{
_units pushBack _x;
};
} forEach (units _parameter);
};
};
}
else
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_GetAllUnits with an invalid parameter: %1 | Type: %2", _x, _tN];
};
};
} forEach _this;
if (DMS_DEBUG) then
{
(format ["GetAllUnits :: Input (%1) produced units: %2",_this,_units]) call DMS_fnc_DebugLog;
};
_units

View File

@ -0,0 +1,405 @@
/*
DMS_fnc_GroupReinforcementsManager
Created by eraser1
Usage:
[
_AIGroup, // GROUP: The AI group to monitor.
[
[
_maxReinforcementWaves, // SCALAR: The maximum number of reinforcement waves that this group can receive. Set to -1 for unlimited reinforcement waves.
_reinforcementWavesGiven // SCALAR: The number of reinforcement waves given to this group.
],
[
_maxReinforcementUnits, // SCALAR: The maximum number of reinforcement units that this group can receive. Set to -1 for unlimited reinforcement units.
_reinforcementUnitsGiven // SCALAR: The number of reinforcement units given to this group.
]
],
[
_updateDelay, // SCALAR: Delay in seconds until the AI group is reinforced.
_lastUpdated // SCALAR: The time (diag_tickTime) when the group was last reinforced.
],
_spawnLocations, // ARRAY: Array of positions (ATL) where reinforcement AI can spawn. Passing an empty array will cause the group leader's position to be used. For "armed_vehicle" _monitorType, a random position between 100 and 300 meters from the leader is used.
_class, // STRING: The "class" of AI to spawn as reinforcements. Supported values: "random","assault","MG","sniper" or "unarmed"
_difficulty, // STRING: The difficulty of the AI to be spawned. Supported values: "random","static","hardcore","difficult","moderate", or "easy"
_side, // STRING: The "side" that the AI are on. Currently only "bandit" is supported.
_monitorType, // STRING: How the AI group should be managed. Supported types: "playernear", "maintain", "reinforce", "increasing_resistance", "armed_vehicle"
_monitorParams // ARRAY: Parameters specific to the _monitorType. See below.
] call DMS_fnc_GroupReinforcementsManager;
About "_monitorType" types:
"playernear":
_monitorParams =
[
_posOrObj, // ARRAY (position): The position at which the players have to be near.
_radius, // SCALAR: The distance (in meters) that a player has to be near in order for reinforcements to spawn
_reinforcementCount, // SCALAR: The (maximum) number of units to spawn as reinforcements.
_maxAICount // (OPTIONAL) SCALAR: Maximum number of AI Units after reinforcements. Set to 0 for no limit. Default value is 0.
]
"maintain":
_monitorParams =
[
_AICount // SCALAR: If the AI Group has fewer than "_AICount" living units, then new members will be added to the group until it has "_AICount" living units again.
]
"reinforce":
_monitorParams =
[
_AICount, // SCALAR: If the AI Group has fewer than "_AICount" living units, then the group will receive reinforcements.
_reinforcementCount, // SCALAR: The (maximum) number of units to spawn as reinforcements.
_maxAICount // (OPTIONAL) SCALAR: Maximum number of AI Units after reinforcements. Set to 0 for no limit. Default value is equivalent to _AICount.
]
"increasing_resistance":
_monitorParams =
[
_AICount, // SCALAR: If the AI Group has fewer than "_AICount" living units, then the group will receive reinforcements.
_reinforcementCount, // SCALAR: The (maximum) number of units to spawn as reinforcements.
_increment_AICount, // SCALAR: After reinforcements, "_AICount" is increased by this amount, so subsequent reinforcements will be spawned for even greater amounts of AI (increasing the number of total AI, until "_maxAICount" is reached).
_maxAICount // (OPTIONAL) SCALAR: Maximum number of AI Units after reinforcements. Default value is equivalent to _AICount. Set to 0 for no limit.
]
"armed_vehicle":
_monitorParams =
[
_AICount, // SCALAR: If the AI Group has fewer than "_AICount" living units, then the group will receive reinforcements.
_vehClass // (OPTIONAL) STRING: The classname of the vehicle to spawn. Use "random" to select a random vehicle from "DMS_ArmedVehicles". Default: "random"
]
NOTE: Every reinforcement vehicle as one unit given for monitor type "armed_vehicle"
Returns whether or not reinforcement waves or units given exceeds/matches maximum wave or unit reinforcements. If true, then no more reinforcements will be spawned (so the passed info should be deleted from the available reinforcements list).
*/
private ["_AIGroup", "_reinforcementInfo", "_updateInfo", "_spawnLocations", "_class", "_difficulty", "_side", "_monitorType", "_monitorParams", "_wavesInfo", "_unitsInfo", "_maxReinforcementWaves", "_reinforcementWavesGiven", "_maxReinforcementUnits", "_reinforcementUnitsGiven", "_updateDelay", "_lastUpdated", "_fnc_isDepleted", "_reinforcementsDepleted"];
// Check ALL the variables
if !(params
[
["_AIGroup", grpNull, [grpNull] ],
["_reinforcementInfo", [], [[]], [2] ],
["_updateInfo", [], [[]], [2] ],
["_spawnLocations", [], [[]] ],
["_class", "", [""] ],
["_difficulty", "", [""] ],
["_side", "", [""] ],
["_monitorType", "", [""] ],
["_monitorParams", [], [[]] ]
])
exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with invalid parameters: %1",_this];
true
};
if !(_reinforcementInfo params
[
["_wavesInfo", [], [[]]],
["_unitsInfo", [], [[]]]
])
exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with invalid _reinforcementInfo: %1",_reinforcementInfo];
true
};
if !(_wavesInfo params
[
["_maxReinforcementWaves", -1, [0]],
["_reinforcementWavesGiven", 0, [0]]
])
exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with invalid _wavesInfo: %1",_wavesInfo];
true
};
if !(_unitsInfo params
[
["_maxReinforcementUnits", -1, [0]],
["_reinforcementUnitsGiven", 0, [0]]
])
exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with invalid _unitsInfo: %1",_unitsInfo];
true
};
if !(_updateInfo params
[
["_updateDelay", 300, [0]],
["_lastUpdated", 0, [0]]
])
exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with invalid _updateInfo: %1",_updateInfo];
true
};
_fnc_isDepleted =
{
switch (true) do
{
// Both "_maxReinforcementWaves" and "_maxReinforcementUnits" are limited, so we check both.
case ((_maxReinforcementWaves>0) && {_maxReinforcementUnits>0}): {((_reinforcementWavesGiven>=_maxReinforcementWaves) || {_reinforcementUnitsGiven>=_maxReinforcementUnits})};
// Only "_maxReinforcementWaves" is limited.
case (_maxReinforcementWaves>0): {(_reinforcementWavesGiven>=_maxReinforcementWaves)};
// Only "_maxReinforcementUnits" is limited.
case (_maxReinforcementUnits>0): {(_reinforcementUnitsGiven>=_maxReinforcementUnits)};
// Neither are limited, so reinforcements will never be depleted.
default {false};
};
};
_reinforcementsDepleted = call _fnc_isDepleted;
if (!_reinforcementsDepleted && {(diag_tickTime-_lastUpdated)>_updateDelay}) then
{
private ["_remainingUnits", "_unitsToSpawn"];
if (isNull _AIGroup) then
{
// The group (presumably) lost all units and got deleted, so we create a new group using the given side and continue with that.
_remainingUnits = 0;
_AIGroup = createGroup (missionNamespace getVariable [format ["DMS_%1Side",_side],EAST]);
_this set [0, _AIGroup];
if (DMS_DEBUG) then
{
(format ["GroupReinforcementsManager :: Group provided was null! Created new group for ""%1"" side: %2",_side, _AIGroup]) call DMS_fnc_DebugLog;
};
}
else
{
_remainingUnits = {alive _x} count (units _AIGroup);
};
if (DMS_DEBUG) then
{
(format ["GroupReinforcementsManager :: Checking reinforcements for group %1 with %2 surviving units. _this: %3",_AIGroup, _remainingUnits, _this]) call DMS_fnc_DebugLog;
};
switch (toLower _monitorType) do
{
case "playernear":
{
private ["_posOrObj", "_radius", "_reinforcementCount", "_maxAICount"];
if !(_monitorParams params
[
["_posOrObj", [], [objNull,[]], [2,3]],
["_radius", 0, [0]],
["_reinforcementCount", 0, [0]]
])
exitWith
{
_reinforcementsDepleted = true;
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with invalid _monitorParams: %1 | _monitorType: %2 | Setting _reinforcementsDepleted to true.",_monitorParams,_monitorType];
};
if ([_posOrObj,_radius] call DMS_fnc_IsPlayerNearby) then
{
_maxAICount = if ((count _monitorParams)>3) then {_monitorParams param [3, 0, [0]]} else {0};
_unitsToSpawn = _reinforcementCount min ((_maxAICount-_remainingUnits) max 0);
};
};
case "maintain":
{
private "_AICount";
if !(_monitorParams params
[
["_AICount", 0, [0]]
])
exitWith
{
_reinforcementsDepleted = true;
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with invalid _monitorParams: %1 | _monitorType: %2 | Setting _reinforcementsDepleted to true.",_monitorParams,_monitorType];
};
if (_remainingUnits<_AICount) then
{
_unitsToSpawn = _AICount - _remainingUnits;
};
};
case "reinforce":
{
private ["_AICount", "_reinforcementCount", "_maxAICount"];
if !(_monitorParams params
[
["_AICount", 0, [0]],
["_reinforcementCount", 0, [0]]
])
exitWith
{
_reinforcementsDepleted = true;
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with invalid _monitorParams: %1 | _monitorType: %2 | Setting _reinforcementsDepleted to true.",_monitorParams,_monitorType];
};
if (_remainingUnits<_AICount) then
{
_maxAICount = if ((count _monitorParams)>2) then {_monitorParams param [2, 0, [0]]} else {_AICount};
_unitsToSpawn = _reinforcementCount min ((_maxAICount-_remainingUnits) max 0);
};
};
case "increasing_resistance":
{
private ["_AICount", "_reinforcementCount", "_increment_AICount", "_maxAICount"];
if !(_monitorParams params
[
["_AICount", 0, [0]],
["_reinforcementCount", 0, [0]],
["_increment_AICount", 0, [0]]
])
exitWith
{
_reinforcementsDepleted = true;
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with invalid _monitorParams: %1 | _monitorType: %2 | Setting _reinforcementsDepleted to true.",_monitorParams,_monitorType];
};
if (_remainingUnits<_AICount) then
{
_maxAICount = if ((count _monitorParams)>3) then {_monitorParams param [3, 0, [0]]} else {_AICount};
_unitsToSpawn = _reinforcementCount min ((_maxAICount-_remainingUnits) max 0);
_monitorParams set [0, _AICount + _increment_AICount];
};
};
case "armed_vehicle":
{
private ["_AICount", "_vehClass", "_leaderPos", "_veh"];
if !(_monitorParams params
[
["_AICount", 0, [0]]
])
exitWith
{
_reinforcementsDepleted = true;
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with invalid _monitorParams: %1 | _monitorType: %2 | Setting _reinforcementsDepleted to true.",_monitorParams,_monitorType];
};
if (_remainingUnits<_AICount) then
{
_vehClass = if ((count _monitorParams)>1) then {_monitorParams param [1, "", [""]]} else {"random"};
_leaderPos = getPosATL (leader _AIGroup);
_veh =
[
[
if (_spawnLocations isEqualTo []) then {[_leaderPos,100+(random 200),random 360] call DMS_fnc_SelectOffsetPos} else {_spawnLocations call BIS_fnc_selectRandom},
_leaderPos
],
_AIGroup,
_class,
_difficulty,
_side,
_vehClass
] call DMS_fnc_SpawnAIVehicle;
// Every vehicle counts as one unit given, so the number of units given is equivalent to number of waves given.
_reinforcementWavesGiven = _reinforcementWavesGiven + 1;
_reinforcementUnitsGiven = _reinforcementWavesGiven;
if (DMS_DEBUG) then
{
(format["GroupReinforcementsManager :: Group %1 received a ""%2"" vehicle (%3) as reinforcements.",_AIGroup, _vehClass, _veh]) call DMS_fnc_DebugLog;
};
};
};
default
{
_reinforcementsDepleted = true;
diag_log format ["DMS ERROR :: Calling DMS_fnc_GroupReinforcementsManager with unsupported _monitorType: %1 | Setting _reinforcementsDepleted to true.",_monitorType];
};
};
if ((!isNil "_unitsToSpawn") && {_unitsToSpawn>0}) then
{
private ["_spawnPos", "_units"];
if (_spawnLocations isEqualTo []) then
{
_spawnPos = getPosATL (leader _AIGroup);
};
if (_maxReinforcementUnits>0) then
{
_maxAvailableReinforcements = (_maxReinforcementUnits-_reinforcementUnitsGiven) max 0;
if (_maxAvailableReinforcements<_unitsToSpawn) then
{
if (DMS_DEBUG) then
{
(format["GroupReinforcementsManager :: Group %1 requested %2 units for backup, but only %3 are available. Providing %3 units and setting _reinforcementsDepleted to true.",_AIGroup, _unitsToSpawn, _maxAvailableReinforcements]) call DMS_fnc_DebugLog;
};
_unitsToSpawn = _maxAvailableReinforcements;
_reinforcementsDepleted = true;
};
};
_units = [];
for "_i" from 1 to _unitsToSpawn do
{
if (isNil "_spawnPos") then
{
_spawnPos = _spawnLocations call BIS_fnc_selectRandom;
};
_units pushBack ([_AIGroup,[_spawnPos,1+(random 3),random 360] call DMS_fnc_SelectOffsetPos,_class,_difficulty,_side,"Soldier"] call DMS_fnc_SpawnAISoldier);
};
_units joinSilent _AIGroup; // Otherwise they don't like each other...
// Update the given reinforcements count.
_reinforcementWavesGiven = _reinforcementWavesGiven + 1;
_reinforcementUnitsGiven = _reinforcementUnitsGiven + _unitsToSpawn;
if (DMS_DEBUG) then
{
(format["GroupReinforcementsManager :: Group %1 received %2 units as backup (wave #%3, %4 units given total). Reinforcements Depleted: %5",_AIGroup, _unitsToSpawn, _reinforcementWavesGiven, _reinforcementUnitsGiven, _reinforcementsDepleted]) call DMS_fnc_DebugLog;
};
};
if (!_reinforcementsDepleted) then
{
_reinforcementsDepleted = call _fnc_isDepleted;
};
// Update values
_this set [1, [[_maxReinforcementWaves,_reinforcementWavesGiven],[_maxReinforcementUnits,_reinforcementUnitsGiven]]];
_this set [2, [_updateDelay,diag_tickTime]];
};
_reinforcementsDepleted

View File

@ -8,7 +8,7 @@
[
_file, // String: The filename (or filepath under the objects folder) that contains the exported M3E objects
_missionPos // Object or Array: Center position
] call DMS_fnc_ImportFromM3E;
] call DMS_fnc_ImportFromM3E_Convert;
This function will take a file exported from M3Editor, convert it into relative position, then place the objects from the converted relative positions.
Use this function if you don't know how to get the relative position, and you only have the exported static positions.
@ -26,7 +26,7 @@ _OK = params
if (!_OK) exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_ImportFromM3E with invalid parameters: %1",_this];
diag_log format ["DMS ERROR :: Calling DMS_fnc_ImportFromM3E_Convert with invalid parameters: %1",_this];
[]
};

View File

@ -0,0 +1,72 @@
/*
DMS_fnc_ImportFromM3E_Static
Created by eraser1
Check out M3 Editor: http://maca134.co.uk/portfolio/m3editor-arma-3-map-editor/
Usage:
[
_file // String: The filename (or filepath under the objects folder) that contains the exported M3E objects
] call DMS_fnc_ImportFromM3E_Static;
_file call DMS_fnc_ImportFromM3E_Static; // This also works
This function will simply create the objects from a file that was exported from M3Editor.
*/
private ["_OK", "_varname", "_file", "_export"];
_OK = params
[
["_file","",[""]]
];
if (!_OK) exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_ImportFromM3E_Static with invalid parameters: %1",_this];
[]
};
_varname = format ["DMS_StaticBaseSpawned_%1",_file];
if (missionNamespace getVariable [_varname,false]) exitWith
{
diag_log format ["DMS ERROR :: Attempting to spawn static base with file ""%1"" after it has already been spawned!",_file];
};
missionNamespace setVariable [_varname,true];
_export = call compile preprocessFileLineNumbers (format ["\x\addons\DMS\objects\static\%1.sqf",_file]);
if ((isNil "_export") || {(typeName _export)!="ARRAY"}) exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_ImportFromM3E_Static with invalid file/filepath: %1 | _export: %2",_file,_export];
[]
};
_objs = [];
{
private ["_obj","_pos"];
_obj = createVehicle [_x select 0, [0,0,0], [], 0, "CAN_COLLIDE"];
_pos = _x select 1;
_obj enableSimulationGlobal false;
if (_x select 4) then
{
_obj setDir (_x select 2);
_obj setPosATL _pos;
}
else
{
_obj setPosATL _pos;
_obj setVectorDirAndUp (_x select 3);
};
_objs pushBack _obj;
} foreach _export;
_objs

View File

@ -19,7 +19,7 @@
Returns whether or not the provided position matches the parameters.
*/
private ["_pos", "_nearestObjectMinDistance", "_waterNearLimit", "_minSurfaceNormal", "_spawnZoneNearLimit", "_traderZoneNearLimit", "_missionNearLimit", "_playerNearLimit", "_territoryNearLimit", "_waterSpawn", "_isValidPos", "_xpos", "_ypos"];
private ["_pos", "_nearestObjectMinDistance", "_waterNearLimit", "_minSurfaceNormal", "_spawnZoneNearLimit", "_traderZoneNearLimit", "_missionNearLimit", "_playerNearLimit", "_territoryNearLimit", "_waterSpawn", "_isValidPos"];
_OK = params
[
@ -55,15 +55,6 @@ else
_pos set [2, 0];
};
_xpos = _pos select 0;
_ypos = _pos select 1;
if ((_xpos<0) || {_ypos<0} || {_xpos>worldSize} || {_ypos>worldSize}) then
{
throw ("or is outside of the map edge");
};
if (!(DMS_findSafePosBlacklist isEqualTo []) && {([_pos, DMS_findSafePosBlacklist] call BIS_fnc_isPosBlacklisted)}) then
{

View File

@ -3,198 +3,15 @@
Created by eraser1
Each mission has its own index in "DMS_Mission_Arr".
Every index is a subarray with the values:
[
_pos,
_completionInfo, //<--- More info in "DMS_AddMissionToMonitor"
[_timeStarted,_timeUntilFail],
[_AIUnit1,_AIUnit2,...,_AIUnitX],
[
[_cleanupObj1,_cleanupObj2,...,_cleanupObjX],
[_vehicle1,_vehicle2,...,_vehicleX],
[
[_crate1,_crate_loot_values1],
[_crate2,_crate_loot_values2]
]
],
[_msgWIN,_msgLose],
[_markerDot,_markerCircle],
_side
]
Calls the respective functions for Dynamic and Static mission monitoring based on DMS configuration.
*/
if (DMS_Mission_Arr isEqualTo []) exitWith {}; // Empty array, no missions running
private ["_pos", "_success", "_timeStarted", "_timeUntilFail", "_units", "_buildings", "_vehs", "_crate_info_array", "_mines", "_missionName", "_msgWIN", "_msgLose", "_markers", "_missionSide", "_arr", "_cleanupList"];
if (DMS_DynamicMission) then
{
try
{
_pos = _x select 0;
_success = (_x select 1) call DMS_fnc_MissionSuccessState;
_timeStarted = _x select 2 select 0;
_timeUntilFail = _x select 2 select 1;
_units = _x select 3;
_buildings = _x select 4 select 0;
_vehs = _x select 4 select 1;
_crate_info_array = _x select 4 select 2;
_mines = _x select 4 select 3;
_missionName = _x select 5 select 0;
_msgWIN = _x select 5 select 1;
_msgLose = _x select 5 select 2;
_markers = _x select 6;
_missionSide = _x select 7;
_missionDifficulty = _x select 8;
_missionEvents = _x select 9;
_onSuccessScripts = _x select 10 select 0;
_onFailScripts = _x select 10 select 1;
call DMS_fnc_MissionsMonitor_Dynamic;
};
if (DMS_DEBUG) then
{
(format ["MissionsMonitor :: Checking Mission Status (index %1): ""%2"" at %3",_forEachIndex,_missionName,_pos]) call DMS_fnc_DebugLog;
};
if (_success) then
{
DMS_CleanUpList pushBack [_units+_buildings,diag_tickTime,DMS_CompletedMissionCleanupTime];
if (_missionSide == "bandit") then
{
DMS_RunningBMissionCount = DMS_RunningBMissionCount - 1;
}
else
{
// Not yet implemented
};
_arr = DMS_Mission_Arr deleteAt _forEachIndex;
{
_x allowDamage true;
_x enableRopeAttach true;
_x enableSimulationGlobal true;
if (_x getVariable ["ExileIsPersistent", false]) then
{
_x lock 0;
_x setVariable ["ExileIsLocked",0];
_x setVariable ["ExileLastLockToggleAt", time];
_x setVariable ["ExileAccessDenied", false];
_x setVariable ["ExileAccessDeniedExpiresAt", 0];
// NOW we save the vehicle in the database, since we know we're not deleting this vehicle.
_x call ExileServer_object_vehicle_database_insert;
_x call ExileServer_object_vehicle_database_update;
}
else
{
_x lock 1;
};
_x call ExileServer_system_simulationMonitor_addVehicle;
} forEach _vehs;
{
_x call DMS_fnc_FillCrate;
} forEach _crate_info_array;
if (DMS_despawnMines_onCompletion) then
{
{
deleteVehicle _x;
} forEach _mines;
};
{
_code = _x;
if ((typeName _code)=="STRING") then
{
_code = compile _code;
};
call _code;
} forEach _onSuccessScripts;
[_missionName,_msgWIN] call DMS_fnc_BroadcastMissionStatus;
[_markers,"win"] call DMS_fnc_RemoveMarkers;
throw format ["Mission (%1) Success at %2 with message %3.",_missionName,_pos,_msgWIN];
};
if ((diag_tickTime-_timeStarted)>_timeUntilFail) then
{
// Check to see if the timeout should be extended before ending the mission.
if (DMS_MissionTimeoutReset && {[_pos,DMS_MissionTimeoutResetRange] call DMS_fnc_IsPlayerNearby}) then
{
_x set [2,[diag_tickTime,_timeUntilFail]];
throw format ["Mission Timeout Extended at %1 with timeout after %2 seconds. Position: %3",diag_tickTime,_timeUntilFail,_pos];
};
//Nobody is nearby so just cleanup objects from here
_cleanupList = (_units+_buildings+_vehs);
{
_cleanupList pushBack (_x select 0);
} forEach _crate_info_array;
_cleanupList call DMS_fnc_CleanUp;
if (_missionSide == "bandit") then
{
DMS_RunningBMissionCount = DMS_RunningBMissionCount - 1;
}
else
{
// Not yet implemented
};
_arr = DMS_Mission_Arr deleteAt _forEachIndex;
{
_code = _x;
if ((typeName _code)=="STRING") then
{
_code = compile _code;
};
call _code;
} forEach _onFailScripts;
[_missionName,_msgLose] call DMS_fnc_BroadcastMissionStatus;
[_markers,"lose"] call DMS_fnc_RemoveMarkers;
throw format ["Mission (%1) Fail at %2 with message %3.",_missionName,_pos,_msgLose];
};
if (DMS_MarkerText_ShowAICount) then
{
private ["_dot", "_text"];
_dot = _markers select 0;
_text = missionNamespace getVariable [format ["%1_text",_dot],_missionName];
if (DMS_MarkerText_ShowMissionPrefix) then
{
_text = format ["%1 %2",DMS_MarkerText_MissionPrefix,_text];
};
_dot setMarkerText (format ["%1 (%2 %3 remaining)",_text,{alive _x} count _units,DMS_MarkerText_AIName]);
};
if !(_missionEvents isEqualTo []) then
{
// Coming soon...
//_x call DMS_fnc_HandleMissionEvents;
};
}
catch
{
if (DMS_DEBUG) then
{
(format ["MissionsMonitor :: %1",_exception]) call DMS_fnc_DebugLog;
};
};
} forEach DMS_Mission_Arr;
if (DMS_StaticMission) then
{
call DMS_fnc_MissionsMonitor_Static;
};

View File

@ -0,0 +1,217 @@
/*
DMS_fnc_MissionsMonitor_Dynamic
Created by eraser1
Each mission has its own index in "DMS_Mission_Arr".
Every index is a subarray with the values:
[
_pos,
_completionInfo, //<--- More info in "DMS_fnc_MissionSuccessState"
[_timeStarted,_timeUntilFail],
[_AIUnit1,_AIUnit2,...,_AIUnitX],
[
[_cleanupObj1,_cleanupObj2,...,_cleanupObjX],
[_vehicle1,_vehicle2,...,_vehicleX],
[
[_crate1,_crate_loot_values1],
[_crate2,_crate_loot_values2]
]
],
[_missionName,_msgWIN,_msgLose],
[_markerDot,_markerCircle],
_missionSide,
_missionDifficulty,
_missionEvents,
_onSuccessScripts,
_onFailScripts,
[
_onSuccessScripts,
_onFailScripts
]
]
A semi-full breakdown can be found in fn_AddMissionToMonitor.sqf
*/
if (DMS_Mission_Arr isEqualTo []) exitWith {}; // Empty array, no missions running
private ["_pos", "_success", "_timeStarted", "_timeUntilFail", "_units", "_buildings", "_vehs", "_crate_info_array", "_mines", "_missionName", "_msgWIN", "_msgLose", "_markers", "_missionSide", "_arr", "_cleanupList"];
{
try
{
_pos = _x select 0;
_success = (_x select 1) call DMS_fnc_MissionSuccessState;
_timeStarted = _x select 2 select 0;
_timeUntilFail = _x select 2 select 1;
_units = _x select 3;
_buildings = _x select 4 select 0;
_vehs = _x select 4 select 1;
_crate_info_array = _x select 4 select 2;
_mines = _x select 4 select 3;
_missionName = _x select 5 select 0;
_msgWIN = _x select 5 select 1;
_msgLose = _x select 5 select 2;
_markers = _x select 6;
_missionSide = _x select 7;
_missionDifficulty = _x select 8;
_missionEvents = _x select 9;
_onSuccessScripts = _x select 10 select 0;
_onFailScripts = _x select 10 select 1;
/*
if (DMS_DEBUG) then
{
(format ["MissionsMonitor_Dynamic :: Checking Mission Status (index %1): ""%2"" at %3",_forEachIndex,_missionName,_pos]) call DMS_fnc_DebugLog;
};
*/
if (_success) then
{
DMS_CleanUpList pushBack [_units+_buildings,diag_tickTime,DMS_CompletedMissionCleanupTime];
if (_missionSide == "bandit") then
{
DMS_RunningBMissionCount = DMS_RunningBMissionCount - 1;
}
else
{
// Not yet implemented
};
_arr = DMS_Mission_Arr deleteAt _forEachIndex;
{
_x allowDamage true;
_x enableRopeAttach true;
_x enableSimulationGlobal true;
if (_x getVariable ["ExileIsPersistent", false]) then
{
_x lock 0;
_x setVariable ["ExileIsLocked",0];
_x setVariable ["ExileLastLockToggleAt", time];
_x setVariable ["ExileAccessDenied", false];
_x setVariable ["ExileAccessDeniedExpiresAt", 0];
// NOW we save the vehicle in the database, since we know we're not deleting this vehicle.
_x call ExileServer_object_vehicle_database_insert;
_x call ExileServer_object_vehicle_database_update;
}
else
{
_x lock 1;
};
_x call ExileServer_system_simulationMonitor_addVehicle;
} forEach _vehs;
{
_x call DMS_fnc_FillCrate;
} forEach _crate_info_array;
if (DMS_despawnMines_onCompletion) then
{
{
deleteVehicle _x;
} forEach _mines;
};
{
_code = _x;
if ((typeName _code)=="STRING") then
{
_code = compile _code;
};
call _code;
} forEach _onSuccessScripts;
[_missionName,_msgWIN] call DMS_fnc_BroadcastMissionStatus;
[_markers,"win"] call DMS_fnc_RemoveMarkers;
throw format ["Mission (%1) Success at %2 with message %3.",_missionName,_pos,_msgWIN];
};
if ((diag_tickTime-_timeStarted)>_timeUntilFail) then
{
// Check to see if the timeout should be extended before ending the mission.
if ((DMS_MissionTimeoutResetRange>0) && {[_pos,DMS_MissionTimeoutResetRange] call DMS_fnc_IsPlayerNearby}) then
{
_x set [2,[diag_tickTime,_timeUntilFail]];
throw format ["Mission Timeout Extended at %1 with timeout after %2 seconds. Position: %3",diag_tickTime,_timeUntilFail,_pos];
};
//Nobody is nearby so just cleanup objects from here
_cleanupList = (_units+_buildings+_vehs);
{
_cleanupList pushBack (_x select 0);
} forEach _crate_info_array;
_cleanupList call DMS_fnc_CleanUp;
if (_missionSide == "bandit") then
{
DMS_RunningBMissionCount = DMS_RunningBMissionCount - 1;
}
else
{
// Not yet implemented
};
_arr = DMS_Mission_Arr deleteAt _forEachIndex;
{
_code = _x;
if ((typeName _code)=="STRING") then
{
_code = compile _code;
};
call _code;
} forEach _onFailScripts;
[_missionName,_msgLose] call DMS_fnc_BroadcastMissionStatus;
[_markers,"lose"] call DMS_fnc_RemoveMarkers;
throw format ["Mission (%1) Fail at %2 with message %3.",_missionName,_pos,_msgLose];
};
if (DMS_MarkerText_ShowAICount) then
{
private ["_dot", "_text"];
_dot = _markers select 0;
_text = missionNamespace getVariable [format ["%1_text",_dot],_missionName];
if (DMS_MarkerText_ShowMissionPrefix) then
{
_text = format ["%1 %2",DMS_MarkerText_MissionPrefix,_text];
};
_dot setMarkerText (format ["%1 (%2 %3 remaining)",_text,{alive _x} count _units,DMS_MarkerText_AIName]);
};
if !(_missionEvents isEqualTo []) then
{
/*
Coming soon...
{
_x call DMS_fnc_HandleMissionEvents;
} forEach _missionEvents;
*/
};
}
catch
{
if (DMS_DEBUG) then
{
(format ["MissionsMonitor_Dynamic :: %1",_exception]) call DMS_fnc_DebugLog;
};
};
} forEach DMS_Mission_Arr;

View File

@ -0,0 +1,236 @@
/*
DMS_fnc_MissionsMonitor_Static
Created by eraser1
Mostly identical to "DMS_fnc_MissionsMonitor_Dynamic"
Each mission has its own index in "DMS_StaticMission_Arr".
Every index is a subarray with the values:
[
_missionPos,
_completionInfo, //<--- More info in "DMS_fnc_MissionSuccessState"
_groupReinforcementsInfo, //<--- More info in "DMS_fnc_GroupReinforcementsManager"
[_timeStarted,_timeUntilFail],
[_AIGroup1,_AIGroup2,...,_AIGroupX],
[
[_cleanupObj1,_cleanupObj2,...,_cleanupObjX],
[_vehicle1,_vehicle2,...,_vehicleX],
[
[_crate1,_crate_loot_values1],
[_crate2,_crate_loot_values2],
...
[_crateX,_crate_loot_valuesX]
],
[_mine1,_mine2,...,_mineX]
],
[_missionName,_msgWIN,_msgLose],
[_markerDot,_markerCircle],
_missionSide,
_missionDifficulty,
_missionEvents,
[
_onSuccessScripts,
_onFailScripts
]
]
A semi-full breakdown can be found in fn_AddStaticMissionToMonitor.sqf
*/
if (DMS_StaticMission_Arr isEqualTo []) exitWith {}; // Empty array, no static missions running
{
try
{
private ["_missionPos", "_completionInfo", "_groupReinforcementsInfo", "_timing", "_inputAIUnits", "_missionObjs", "_msgInfo", "_markers", "_missionSide", "_missionDifficulty", "_missionEvents", "_endingScripts", "_success", "_timeStarted", "_timeUntilFail", "_buildings", "_vehs", "_crate_info_array", "_mines", "_missionName", "_msgWIN", "_msgLose", "_onSuccessScripts", "_onFailScripts"];
if !(_x params
[
["_missionPos", [], [[]], [2,3] ],
["_completionInfo", [], [[]] ],
["_groupReinforcementsInfo", [], [[]] ],
["_timing", [], [[]], [2] ],
["_inputAIUnits", [], [[]] ],
["_missionObjs", [], [[]], [4] ],
["_msgInfo", [], [[]], [3] ],
["_markers", [], [[]], [2] ],
["_missionSide", "", [""] ],
["_missionDifficulty", "", [""] ],
["_missionEvents", [], [[]] ],
["_endingScripts", [], [[]], [2] ]
])
then
{
DMS_StaticMission_Arr deleteAt _forEachIndex;
diag_log format ["DMS ERROR :: Invalid Index (%1) in DMS_StaticMission_Arr: %2",_forEachIndex,_x];
throw "DMS ERROR";
};
_success = _completionInfo call DMS_fnc_MissionSuccessState;
_timeStarted = _timing select 0;
_timeUntilFail = _timing select 1;
_buildings = _missionObjs select 0;
_vehs = _missionObjs select 1;
_crate_info_array = _missionObjs select 2;
_mines = _missionObjs select 3;
_missionName = _msgInfo select 0;
_msgWIN = _msgInfo select 1;
_msgLose = _msgInfo select 2;
_onSuccessScripts = _endingScripts select 0;
_onFailScripts = _endingScripts select 1;
/*
if (DMS_DEBUG) then
{
(format ["MissionsMonitor_Dynamic :: Checking Mission Status (index %1): ""%2"" at %3",_forEachIndex,_missionName,_missionPos]) call DMS_fnc_DebugLog;
};
*/
if (_success) then
{
_AIUnits = _inputAIUnits call DMS_fnc_GetAllUnits;
DMS_CleanUpList pushBack [_AIUnits+_buildings,diag_tickTime,DMS_CompletedMissionCleanupTime];
{
_x allowDamage true;
_x enableRopeAttach true;
_x enableSimulationGlobal true;
if (_x getVariable ["ExileIsPersistent", false]) then
{
_x lock 0;
_x setVariable ["ExileIsLocked",0];
_x setVariable ["ExileLastLockToggleAt", time];
_x setVariable ["ExileAccessDenied", false];
_x setVariable ["ExileAccessDeniedExpiresAt", 0];
// NOW we save the vehicle in the database, since we know we're not deleting this vehicle.
_x call ExileServer_object_vehicle_database_insert;
_x call ExileServer_object_vehicle_database_update;
}
else
{
_x lock 1;
};
_x call ExileServer_system_simulationMonitor_addVehicle;
} forEach _vehs;
{
_x call DMS_fnc_FillCrate;
} forEach _crate_info_array;
if (DMS_despawnMines_onCompletion) then
{
{
deleteVehicle _x;
} forEach _mines;
};
{
_code = _x;
if ((typeName _code)=="STRING") then
{
_code = compile _code;
};
call _code;
} forEach _onSuccessScripts;
[_missionName,_msgWIN] call DMS_fnc_BroadcastMissionStatus;
[_markers,"win"] call DMS_fnc_RemoveMarkers;
DMS_StaticMission_Arr deleteAt _forEachIndex;
DMS_RunningStaticMissions deleteAt _forEachIndex;
throw format ["Mission (%1) Success at %2 with message %3.",_missionName,_missionPos,_msgWIN];
};
if ((diag_tickTime-_timeStarted)>_timeUntilFail) then
{
// Check to see if the timeout should be extended before ending the mission.
if ((DMS_StaticMissionTimeoutResetRange>0) && {[_missionPos,DMS_StaticMissionTimeoutResetRange] call DMS_fnc_IsPlayerNearby}) then
{
_x set [2,[diag_tickTime,_timeUntilFail]];
throw format ["Mission Timeout Extended at %1 with timeout after %2 seconds. Position: %3",diag_tickTime,_timeUntilFail,_missionPos];
};
_AIUnits = _inputAIUnits call DMS_fnc_GetAllUnits;
//Nobody is nearby so just cleanup objects from here
_cleanupList = (_AIUnits+_buildings+_vehs);
{
_cleanupList pushBack (_x select 0);
} forEach _crate_info_array;
_cleanupList call DMS_fnc_CleanUp;
{
_code = _x;
if ((typeName _code)=="STRING") then
{
_code = compile _code;
};
call _code;
} forEach _onFailScripts;
[_missionName,_msgLose] call DMS_fnc_BroadcastMissionStatus;
[_markers,"lose"] call DMS_fnc_RemoveMarkers;
DMS_StaticMission_Arr deleteAt _forEachIndex;
DMS_RunningStaticMissions deleteAt _forEachIndex;
throw format ["Mission (%1) Fail at %2 with message %3.",_missionName,_missionPos,_msgLose];
};
if (DMS_MarkerText_ShowAICount) then
{
private ["_dot", "_text"];
_AIUnits = _inputAIUnits call DMS_fnc_GetAllUnits;
_dot = _markers select 0;
_text = missionNamespace getVariable [format ["%1_text",_dot],_missionName];
if (DMS_MarkerText_ShowMissionPrefix) then
{
_text = format ["%1 %2",DMS_MarkerText_MissionPrefix,_text];
};
_dot setMarkerText (format ["%1 (%2 %3 remaining)",_text,{alive _x} count _AIUnits,DMS_MarkerText_AIName]);
};
if !(_missionEvents isEqualTo []) then
{
/*
Coming soon...
{
_x call DMS_fnc_HandleMissionEvents;
} forEach _missionEvents;
*/
};
{
if (_x call DMS_fnc_GroupReinforcementsManager) then
{
_groupReinforcementsInfo deleteAt _forEachIndex;
};
} forEach _groupReinforcementsInfo;
}
catch
{
if (DMS_DEBUG) then
{
(format ["MissionsMonitor_Dynamic :: %1",_exception]) call DMS_fnc_DebugLog;
};
};
} forEach DMS_StaticMission_Arr;

View File

@ -14,9 +14,14 @@ if (DMS_RunningBMissionCount >= DMS_MaxBanditMissions) then
DMS_BMissionLastStart = _time;
};
if ((count DMS_RunningStaticMissions) >= DMS_MaxStaticMissions) then
{
DMS_StaticMissionLastStart = _time;
};
if (diag_fps >= DMS_MinServerFPS && {(count allPlayers) >= DMS_MinPlayerCount}) then
{
// More Mission types coming soon
if (_time - DMS_BMissionLastStart > DMS_BMissionDelay) then
{
private "_mission";
@ -34,4 +39,35 @@ if (diag_fps >= DMS_MinServerFPS && {(count allPlayers) >= DMS_MinPlayerCount})
(format ["SelectMission :: Spawning of bandit mission ""%1"" complete!"]) call DMS_fnc_DebugLog;
};
};
if (_time - DMS_StaticMissionLastStart > DMS_StaticMissionDelay) then
{
private ["_mission", "_availableMissions"];
_availableMissions = (DMS_StaticMissionTypesArray - DMS_RunningStaticMissions);
if (_availableMissions isEqualTo []) exitWith
{
DMS_StaticMissionLastStart = _time;
if (DMS_DEBUG) then
{
(format ["SelectMission :: No available missions! Running missions: %1", DMS_RunningStaticMissions]) call DMS_fnc_DebugLog;
};
};
_mission = _availableMissions call BIS_fnc_selectRandom;
if (DMS_DEBUG) then
{
(format ["SelectMission :: Selected static mission: %1", _mission]) call DMS_fnc_DebugLog;
};
[_mission] call DMS_fnc_SpawnStaticMission;
if (DMS_DEBUG) then
{
(format ["SelectMission :: Spawning of static mission ""%1"" complete!", _mission]) call DMS_fnc_DebugLog;
};
};
};

View File

@ -57,6 +57,6 @@ else
{
if (DMS_DEBUG) then
{
(format ["SetAILocality :: No viable client found for the ownership of %1!",_AI]) call DMS_fnc_DebugLog;
(format ["SetAILocality :: No viable client found for the ownership of %1! _pos: %2",_AI,_pos]) call DMS_fnc_DebugLog;
};
};

View File

@ -49,6 +49,7 @@ _group = createGroup (missionNamespace getVariable [format ["DMS_%1Side",_side],
_group setVariable ["DMS_LockLocality",nil];
_group setVariable ["DMS_SpawnedGroup",true];
_group setVariable ["DMS_Group_Side", _side];
if (_count < 1) exitWith
{

View File

@ -329,13 +329,21 @@ if (DMS_ai_disable_ramming_damage) then
}];
};
_unit enableAI "TARGET";
_unit enableAI "AUTOTARGET";
_unit enableAI "MOVE";
_unit enableAI "ANIM";
_unit enableAI "FSM";
{
_unit enableAI _x;
} forEach ["TARGET", "AUTOTARGET", "MOVE", "ANIM", "FSM"];
if (_difficulty=="hardcore") then
{
// Make him a little bit harder ;)
{
_unit disableAI _x;
} forEach ["SUPPRESSION", "AIMINGERROR"];
};
_unit setVariable ["DMS_AISpawnTime", time];
_unit setVariable ["DMS_AI_Side", _side];
if (_type=="Soldier") then
{

View File

@ -1,5 +1,5 @@
/*
DMS_fnc_SpawnAIStatic
DMS_fnc_SpawnAIStaticMG
Created by eraser1
Influenced by WAI
@ -16,7 +16,7 @@
_difficulty, // Difficulty: "random","static","hardcore","difficult","moderate", or "easy"
_side, // "bandit","hero", etc.
_MGClass // !OPTIONAL) String: classname of the MG. Use "random" to select a random one from DMS_static_weapons
] call DMS_fnc_SpawnAIStatic;
] call DMS_fnc_SpawnAIStaticMG;
Returns an array of static gun objects.
*/
@ -35,7 +35,7 @@ _OK = params
if (!_OK) exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_SpawnAIStatic with invalid parameters: %1",_this];
diag_log format ["DMS ERROR :: Calling DMS_fnc_SpawnAIStaticMG with invalid parameters: %1",_this];
};
_MGClassInput = "random";
@ -62,6 +62,8 @@ _guns = [];
_gun addEventHandler ["GetOut",{(_this select 0) setDamage 1;}];
_gun lock 2;
_group addVehicle _gun;
_guns pushBack _gun;
_unit = [_group,_pos,_class,_difficulty,_side,"Static"] call DMS_fnc_SpawnAISoldier;
@ -72,14 +74,14 @@ _guns = [];
if (DMS_DEBUG) then
{
(format ["SpawnAIStatic :: Created unit %1 at %2 as static gunner in %3",_unit,_pos,_gun]) call DMS_fnc_DebugLog;
(format ["SpawnAIStaticMG :: Created unit %1 at %2 as static gunner in %3",_unit,_pos,_gun]) call DMS_fnc_DebugLog;
};
} forEach _positions;
if (DMS_DEBUG) then
{
(format ["SpawnAIStatic :: Created %1 static AI with parameters: %2",count _positions,_this]) call DMS_fnc_DebugLog;
(format ["SpawnAIStaticMG :: Created %1 static AI with parameters: %2",count _positions,_this]) call DMS_fnc_DebugLog;
};
_guns

View File

@ -23,7 +23,7 @@ private ["_OK", "_positions", "_veh", "_spawnPos", "_gotoPos", "_vehClass", "_dr
_OK = params
[
["_positions",[],[[]],[2]],
["_positions",[],[[]],[1,2]],
["_group",grpNull,[grpNull]],
["_class","random",[""]],
["_difficulty","static",[""]],
@ -45,8 +45,7 @@ if (!_OK) exitWith
diag_log format ["DMS ERROR :: Calling DMS_fnc_SpawnAIVehicle with invalid _positions parameters: %1",_positions];
};
// Simply use _spawnPos if _gotoPos isn't defined. Yes, you might get "param"/"params" RPT spam. Deal with it ;)
_gotoPos = _positions param [1,_spawnPos,[[]],[2,3]];
_gotoPos = if ((count _positions)>1) then {_positions param [1,_spawnPos,[[]],[2,3]]} else {_spawnPos};
_vehClass = "random";
if ((count _this)>5) then
@ -63,9 +62,11 @@ _tmpGroup = createGroup (missionNamespace getVariable [format ["DMS_%1Side",_sid
_veh = createVehicle [_vehClass, _spawnPos, [], 0, "NONE"];
_veh setDir (random 360);
_veh setPosATL _spawnPos;
_veh lock 2;
_group addVehicle _veh;
_tmpGroup addVehicle _veh;
_driver = [_tmpGroup,_spawnPos,_class,_difficulty,_side,"Vehicle"] call DMS_fnc_SpawnAISoldier;
_gunner = [_tmpGroup,_spawnPos,_class,_difficulty,_side,"Vehicle"] call DMS_fnc_SpawnAISoldier;

View File

@ -12,7 +12,7 @@
*/
private ["_OK", "_missionType", "_parameters"];
private ["_missionType", "_parameters"];
_missionType = param [0, DMS_BanditMissionTypesArray call BIS_fnc_selectRandom, [""]];
@ -36,6 +36,6 @@ else
if (DMS_DEBUG) then
{
(format ["SelectMission :: Spawned mission %1 with parameters (%2) | DMS_BMissionDelay set to %3 seconds",str _missionType,_parameters,DMS_BMissionDelay]) call DMS_fnc_DebugLog;
(format ["SpawnBanditMission :: Spawned mission %1 with parameters (%2) | DMS_BMissionDelay set to %3 seconds", _missionType, _parameters, DMS_BMissionDelay]) call DMS_fnc_DebugLog;
};
};

View File

@ -0,0 +1,65 @@
/*
DMS_fnc_SpawnStaticMission
Created by eraser1
Usage:
[
_missionType,
_parameters
] call DMS_fnc_SpawnStaticMission;
Simply spawns a mission with the given mission type and passes parameters to it. Returns nothing
If the mission returns the string "delay", then DMS will attempt to spawn the mission again in 60 seconds.
*/
private ["_missionType", "_parameters", "_return"];
_missionType = param [0, DMS_StaticMissionTypesArray call BIS_fnc_selectRandom, [""]];
try
{
if !(_missionType in DMS_StaticMissionTypesArray) then
{
throw format ["for a mission that isn't in DMS_StaticMissionTypesArray! Parameters: %1",_this];
};
if (_missionType in DMS_RunningStaticMissions) then
{
throw format ["with a mission that's already running! Parameters: %1",_this];
};
_parameters = if ((count _this)>1) then {_this select 1} else {[]};
DMS_MissionCount = DMS_MissionCount + 1;
_return = _parameters call compile preprocessFileLineNumbers (format ["\x\addons\DMS\missions\static\%1.sqf",_missionType]);
if ((!isNil "_return") && {_return isEqualTo "delay"}) exitWith
{
DMS_MissionCount = DMS_MissionCount - 1;
// This will cause mission spawning to run in scheduled, but that should be a fairly minor issue.
[60, DMS_fnc_SpawnStaticMission, [_missionType], false] call ExileServer_system_thread_addTask;
if (DMS_DEBUG) then
{
(format ["SpawnStaticMission :: Mission ""%1"" requested delay",_missionType]) call DMS_fnc_DebugLog;
};
};
DMS_StaticMissionDelay = DMS_TimeBetweenStaticMissions call DMS_fnc_SelectRandomVal;
DMS_StaticMissionLastStart = diag_tickTime;
DMS_RunningStaticMissions pushBack _missionType;
if (DMS_DEBUG) then
{
(format ["SpawnStaticMission :: Spawned mission %1 with parameters (%2) | DMS_StaticMissionDelay set to %3 seconds", _missionType, _parameters, DMS_StaticMissionDelay]) call DMS_fnc_DebugLog;
};
}
catch
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_SpawnStaticMission %1", _exception];
};

View File

@ -1 +0,0 @@
/*TODO*/

Binary file not shown.

View File

@ -1,8 +1,8 @@
# To the User:
####Read the instructions carefully. Before leaving any questions regarding DMS, please read through the [DMS "config.sqf"](https://github.com/Defent/DMS_Exile/blob/master/%40ExileServer/addons/a3_dms/config.sqf) ; the majority of the questions we receive are answered (directly or indirectly) by the config.
####Read the instructions carefully. Before leaving any questions regarding DMS, please read through the [DMS "config.sqf"](https://github.com/Defent/DMS_Exile/blob/master/%40ExileServer/addons/a3_dms/config.sqf); the majority of the questions we receive are answered (directly or indirectly) by the config.
####Disclaimer:
Defent's Mission System (DMS) is written from the ground up to be an efficient, easy to install, and vastly customizable mission system for the ArmA 3 [Exile Mod](http://www.exilemod.com/). You are perfectly welcome to port DMS or any of its functions for any other mod or (legal) purposes. Providing credit is appreciated.
Defent's Mission System (DMS) is written from the ground up to be an efficient, easy to install, and vastly customizable mission system for the ArmA 3 [Exile Mod](http://www.exilemod.com/). You are welcome to port DMS or any of its functions for any other mod or (legal) purposes. Providing credit is appreciated.
However, creating such a mission system takes a lot of time and testing. We (the authors of DMS) are not perfect, and as a result, there may be bugs, glitches, and/or errors within DMS. We appreciate your co-operation in identifying and resolving such issues to improve DMS; however we are not liable for any issues resulting from the usage of DMS on/by your server. We are also not liable to help you in resolving any issues that may arise, although we will attempt to help you to some degree in most cases.
@ -12,8 +12,9 @@ ___
# Instructions
See also: http://www.exilemod.com/topic/61-dms-defents-mission-system/?do=findComment&comment=242
DMS will work "out-of-the-box" for almost any map. You have to keep in mind that if the map is too small (such as Stratis), then you will need to reduce the [Mission spawn location settings](https://github.com/Defent/DMS_Exile/blob/master/%40ExileServer/addons/a3_dms/config.sqf#L63-L77). Also, for especially hilly maps (such as Panthera), you will need to reduce the [Minimum surfaceNormal](https://github.com/Defent/DMS_Exile/blob/master/%40ExileServer/addons/a3_dms/config.sqf#L76) (the config value is automatically adjusted for some maps. You can check the [map configs](https://github.com/Defent/DMS_Exile/tree/master/%40ExileServer/addons/a3_dms/map_configs) to see the adjusted config value overwrites).
## To install:
## Installation:
Put the pre-packed PBO in your ```@ExileServer\addons\``` directory. It should be alongside ```exile_server``` and ```exile_server_config```.
If you are using Vilayer or some other GameServer hosting service, and/or the above step did not work, then create a new folder called @a3_dms in the root ArmA 3 folder, create a subfolder called "addons", and place the "a3_dms.pbo" in the "addons" subfolder. Then, edit your startup parameters/modline to include "@a3_dms". For example: ```-serverMod=@ExileServer;@a3_dms;```
@ -28,28 +29,12 @@ If you are using infiSTAR and want to keep ```_CGM = true;```, then set ```_UMW
1. Download the a3_dms folder
2. Edit the config.sqf to your preferences.
3. Pack the a3_dms folder with a PBO tool (**PBO Manager**, Eliteness, or Arma 3 Tools suite)
4. Follow the ["To install:" steps](https://github.com/Defent/DMS_Exile#to-install) using the PBO you just created instead of the pre-packed one.
4. Follow the ["Installation:" steps](https://github.com/Defent/DMS_Exile#to-install) using the PBO you just created instead of the pre-packed one.
### HEADLESS CLIENT:
**The way DMS utilizes HC is unfavorable for large maps. As a result, we are dropping HC support for DMS until it is completed, then we will create proper Headless Client support.**
People have reported Headless Client working properly in ArmA v1.52
Add this code to the TOP of your initPlayerLocal.sqf
```
if (!hasInterface && !isServer) then
{
1 spawn
{
waitUntil {player==player};
DMS_HC_Object = player;
publicVariableServer "DMS_HC_Object";
};
};
```
**We are dropping Headless Client support for DMS until it is completed, then we will create proper HC support.**
___
@ -64,18 +49,14 @@ ___
- [Nawuko](https://github.com/Nawuko) for catching a silly mistake :P
- [shaworth](https://github.com/shaworth) and [KawaiiPotato](https://github.com/KawaiiPotato) for making the README all nice and pretty :)
- [maca134](http://maca134.co.uk/portfolio/m3editor-arma-3-map-editor/) for M3Editor Stuff
- [Darth Rogue from SOA](http://soldiersofanarchy.net/) for the awesome base for the first DMS static mission :D
- Everbody's feedback on [the DMS thread on exile forums](http://www.exilemod.com/topic/61-dms-defents-mission-system/?do=findComment&comment=242)
___
# Roadmap:
#### Continuous Optimization + Improvements.
#### Static Mission(s):
* Create a sample static mission on the salt flats for Altis. Maybe other samples for other maps later on.
* Implement a function that continues to spawn AI on a static mission.
* Create a kick-ass static AI base :P
* Implement the ability to "freeze" and "unfreeze" AI when there are no players nearby to improve performance.
* Implement the ability to "freeze" and "unfreeze" AI when there are no players nearby to improve performance. This will be under testing with a few selected server owners/community members. If you would like to participate in testing, please send a PM to [eraser1 on Exile Forums](http://www.exilemod.com/profile/96-eraser1/).
#### AI Heli Paratroopers/air support.
@ -89,6 +70,8 @@ ___
* Spawn AI that are meant to "hunt" individual players.
* Air/Land AI Vehicle Patrols
#### Full Headless Client Support.
#### Custom client notifications.
#### (Maybe) Implement a form of stat-tracking system
@ -97,6 +80,44 @@ ___
___
# Changelog:
#### October 30, 2015 (9:30 PM CST-America):
* ** NEW CONFIG VALUES:
|DMS_MaxStaticMissions|
|DMS_TimeToFirstStaticMission|
|DMS_TimeBetweenStaticMissions|
|DMS_StaticMissionTimeOut|
|DMS_StaticMissionTimeoutResetRange|
|DMS_StaticMinPlayerDistance|
|DMS_UsePredefinedMissionLocations|
|DMS_PredefinedMissionLocations|
|DMS_MinDistFromWestBorder|
|DMS_MinDistFromEastBorder|
|DMS_MinDistFromSouthBorder|
|DMS_MinDistFromNorthBorder|
|DMS_StaticMissionTypes|
**
* Added new value "DMS_Version".
* ** "DMS_fnc_SpawnAIStatic" is now "DMS_fnc_SpawnAIStaticMG"; donthasslethehoff, mercbase, and testmission have been updated with the new names**
* DMS will now check to make sure that marker colors passed to fn_CreateMarker are valid marker colors.
* You can now control how far away from each border a mission will spawn (each border is separate: west, east, south, north). All "supported" maps have config values adjusted in "map_configs".
* New salt flats base by [Darth Rogue from SOA](http://soldiersofanarchy.net/).
* **IMPLEMENTED STATIC MISSIONS (initial version). "saltflats" is currently the only static mission for Altis ONLY. However, it shouldn't be too difficult to export it to other maps (once positions have been adjusted). **
* Fixed a couple of outdated/inaccurate function documentation comments.
* **FINALLY REMOVED THE Default Value "-1" PARAMS RPT SPAM. I FOUND IT. YESSSSS**
* Fixed fn_CleanUp producing debug logs even with debug disabled.
* Fixed the CleanUp list not Cleaning Up after itself (hah!).
* Added diag_tickTime and DMS_Version to debug logs.
* You can now define a custom function for DMS_FillCrate. It will be passed params from _lootValues select 0. ** I haven't tested this at all. Just keep that in mind ;) **
* You can now manually define mission spawning locations into an array, and that array will be used to find a location. Each location will still be checked for validity, and if no valid positions are found from the list, a random one is then generated using the normal method. ** I didn't test this part at all either :P **
* fn_FindSafePos should be even more efficient now, and even more controllable.
* Quite a few new functions; most notably: fn_GroupReinforcementsManager
* fn_GroupReinforcementsManager is used by static missions to provide reinforcements for AI once they fall below a certain threshold (and/or any other parameters you provide). Make sure to check out the function documentation and give any suggestions for new reinforcement types!
* New function "DMS_fnc_ImportFromM3E_Static" will simply import a base from the provided file (under static). No conversion to relative position or anything. Simply spawning, positioning, and disabling simulation.
* Removed the check for being outside map edges from fn_isValidPosition.
* "hardcore" AI will now be even more difficult ;)
#### October 17, 2015 (2:30 PM CST-America):
* **NEW CONFIG VALUES**: