2015-08-28 21:52:56 +00:00
/*
DMS_findSafePos
Created by eraser1
Usage:
[
2015-08-31 02:42:02 +00:00
_nearestObjectMinDistance, // (OPTIONAL) Number: Minimum distance from nearest object
_maxTerrainGradient // (OPTIONAL) Number: Maximum terrain gradient (slope)
2015-08-28 21:52:56 +00:00
] call DMS_findSafePos;
*/
private ["_nearestObjectMinDistance","_maxTerrainGradient","_safePosParams","_validspot","_i","_pos"];
2015-08-28 19:14:59 +00:00
2015-08-31 02:42:02 +00:00
params
[
["_nearestObjectMinDistance",25,[0]],
["_maxTerrainGradient",10,[0]]
];
2015-08-28 06:04:50 +00:00
2015-08-28 22:52:58 +00:00
_safePosParams =
[
[[],0,-1,_nearestObjectMinDistance,0,_maxTerrainGradient,0,DMS_findSafePosBlacklist],
[[16000,16000],0,16000,_nearestObjectMinDistance,0,_maxTerrainGradient,0,DMS_findSafePosBlacklist] //[16000,16000] w/ radius of 16000 works well for Altis
] select (worldName=="Altis");
2015-08-28 06:04:50 +00:00
_validspot = false;
_i = 0;
while{!_validspot} do {
2015-08-28 19:14:59 +00:00
_pos = _safePosParams call BIS_fnc_findSafePos;
2015-08-28 06:04:50 +00:00
_i = _i+1;
2015-08-28 21:52:56 +00:00
try
{
2015-08-28 19:14:59 +00:00
// Check for nearby water
if ([_pos,DMS_WaterNearBlacklist] call DMS_isNearWater) exitWith
2015-08-28 06:04:50 +00:00
{
2015-08-28 19:14:59 +00:00
throw ("water");
2015-08-28 06:04:50 +00:00
};
2015-08-28 19:14:59 +00:00
// Check for nearby players
if ([_pos,DMS_PlayerNearBlacklist] call ExileServer_util_position_isPlayerNearby) exitWith
2015-08-28 06:04:50 +00:00
{
2015-08-28 19:14:59 +00:00
throw ("players");
2015-08-28 06:04:50 +00:00
};
2015-08-28 19:14:59 +00:00
{
// Check for nearby spawn points
2015-08-30 00:33:32 +00:00
if (((markertype _x) == "ExileSpawnZone") && {((getMarkerPos _x) distance2D _pos)<=DMS_SpawnZoneNearBlacklist}) exitWith
2015-08-28 19:14:59 +00:00
{
throw ("a spawn zone");
};
2015-08-28 06:04:50 +00:00
2015-08-28 19:14:59 +00:00
// Check for nearby trader zones
2015-08-30 00:33:32 +00:00
if (((markertype _x) == "ExileTraderZone") && {((getMarkerPos _x) distance2D _pos)<=DMS_TraderZoneNearBlacklist}) exitWith
2015-08-28 19:14:59 +00:00
{
throw ("a trader zone");
};
2015-08-28 06:04:50 +00:00
2015-08-28 19:14:59 +00:00
// Check for nearby missions
if (((_x find "DMS_MissionMarkerDot")>-1) && {((getMarkerPos _x) distance2D _pos)<=DMS_MissionNearBlacklist}) exitWith
2015-08-28 06:04:50 +00:00
{
2015-08-28 19:14:59 +00:00
throw ("another mission");
2015-08-28 06:04:50 +00:00
};
2015-09-04 16:35:19 +00:00
} forEach allMapMarkers;
2015-08-28 19:14:59 +00:00
// No exceptions found
_validspot = true;
}
catch
{
if (DMS_DEBUG) then {
diag_log format ["DMS_DEBUG findSafePos :: Exception in attempt %1 | Position %2 is too close to %3!",_i,_pos,_exception];
};
2015-08-28 06:04:50 +00:00
};
};
2015-08-28 19:14:59 +00:00
if(DMS_DEBUG) then {
diag_log format["DMS_DEBUG findSafePos :: Mission position %1 with %2 params found in %3 attempts.",_pos,_safePosParams,_i];
};
_pos set [2, 0];
_pos;