Updates to code finding location for missions.

This commit is contained in:
Chris Cardozo 2020-06-13 14:14:46 -04:00
parent f677f8f950
commit 03c031537c
5 changed files with 171 additions and 26 deletions

View File

@ -12,24 +12,24 @@
#include "\q\addons\custom_server\Configs\blck_defines.hpp";
if (isNil "blck_locationBlackList") then {blck_locationBlackList = []};
private _blacklistedLocations = blck_locationBlackList;
_fn_buildBlacklistedLocationsList = {
params["_minToBases","_minToPlayers","_minToMissions","_minToTowns","_minToRecentMissionLocation"];
private _blacklistedLocations = +blck_locationBlackList;
/* locations of villages / cities / others already included in blck_locationBlackList so we do not need to add it here. */
private _blacklistedLocs = +blck_locationBlackList;
for '_i' from 1 to (count blck_recentMissionCoords) do {
private _loc = blck_recentMissionCoords deleteAt 0;
if (_loc select 1 < diag_tickTime) then
{
blck_recentMissionCoords pushBack _loc;
_blacklistedLocations pushBack [_loc select 0, _minToRecentMissionLocation];
_blacklistedLocs pushBack [_loc select 0, _minToRecentMissionLocation];
};
};
{
_blacklistedLocations pushBack [_x,_minToMissions];
_blacklistedLocs pushBack [_x,_minToMissions];
} forEach blck_ActiveMissionCoords;
private "_bases";
@ -37,23 +37,21 @@ _fn_buildBlacklistedLocationsList = {
if (blck_modType isEqualTo "Exile") then {_bases = nearestObjects[blck_mapCenter, ["Exile_Construction_Flag_Static"], blck_mapRange + 25000]};
{
_blacklistedLocations pushBack [getPosATL _x,_minToBases];
_blacklistedLocs pushBack [getPosATL _x,_minToBases];
} forEach _bases;
{
_blacklistedLocations pushBack [getPosATL _x,_minToPlayers];
_blacklistedLocs pushBack [getPosATL _x,_minToPlayers];
} forEach allPlayers;
if (blck_minDistanceFromDMS > 0) then
{
_blacklistedLocations append ([] call blck_fnc_getAllDMSMarkers);
_blacklistedLocs append ([] call blck_fnc_getAllDMSMarkers);
};
_blacklistedLocations
//diag_log format["_blacklistedLocs = %1",_blacklistedLocs];
_blacklistedLocs
};
private _minDistToBases = blck_minDistanceToBases;
@ -61,27 +59,36 @@ private _minDistToPlayers = blck_minDistanceToPlayer;
private _minDistToTowns = blck_minDistanceFromTowns;
private _mindistToMissions = blck_MinDistanceFromMission;
private _minToRecentMissionLocation = 200;
private _coords = [];
private _blacklistedLocations = [_minDistToBases,_minDistToPlayers,_minDistToTowns,_mindistToMissions,_minToRecentMissionLocation] call _fn_buildBlacklistedLocationsList;
private _coords = [blck_mapCenter,0,blck_mapRange,3,0,5,0,_blacklistedLocations] call BIS_fnc_findSafePos;
if (_coords isEqualTo []) then
private _count = 25;
while {_coords isEqualTo [] && _count > 0} do
{
for "_index" from 1 to 100 do
/*
6-13-20
Notes
increased min distance to objects from 3 to 10
decreased max slope from 5 to 0.5
*/
_coords = [blck_mapCenter,0,blck_mapRange,10,0,0.5,0,_blacklistedLocations] call BIS_fnc_findSafePos;
/* Check whether the location is flat enough: returns [] if not. */
private _isFlat = _coords isFlatEmpty [20,0,0.5,100,0,false];
if (_coords isEqualTo [] || !(_isFlat isEqualTo [])) then
{
{
_x set[1, (_x select 1) * 0.8];
} forEach _blacklistedLocations;
_coords = [blck_mapCenter,0,blck_mapRange,3,0,5,0,_blacklistedLocations] call BIS_fnc_findSafePos;
if !(_coords isEqualTo []) exitWith {};
uisleep 1;
//private _range = (_x select 1) * 0.7;
_x set[1,(_x select 1) * 0.75];
} forEach _blackListedLocations;
_count = _count - 1;
};
};
if (_coords isEqualTo []) then
{
diag_log format["[blckeagls] <ERROR> Could not find a safe position for a mission, consider reducing values for minimum distances between missions and players, bases, other missions or towns"];
};
_coords

View File

@ -0,0 +1,97 @@
private _safepos = [getMarkerPos "center",0,14000,0,0,0.5,0];
private _validspot = false;
private "_position";
_fnc_nearWater = {
_result = false;
_position = _this select 0;
_radius = _this select 1;
for "_i" from 0 to 359 step 45 do {
//_checkposition = [(_position select 0) + (sin(_i)*_radius), (_position select 1) + (cos(_i)*_radius)];
//_checkposition2 = [(_position select 0) + (sin(_i)*_radius/2), (_position select 1) + (cos(_i)*_radius/2)];
_checkPosition = _position getPos[_radius, _i];
if (surfaceIsWater _checkposition) exitWith {
_result = true;
};
};
_result
};
while{!_validspot} do {
//uiSleep 1;
_validspot = true;
_position = _safepos call BIS_fnc_findSafePos;
if (count _position > 2) then {
_validspot = false;
};
if(_validspot) then {
if ([_position,500] call _fnc_nearWater) then {
_validspot = false;
};
};
if(_validspot) then {
_isflat = _position isFlatEmpty [20,0,0.5,100,0,false];
if (_isflat isequalto []) then {
_validspot = false;
};
};
if(_validspot) then {
{
if (_position distance _x < 1500) exitwith {
_validspot = false;
};
} foreach (missionnamespace getvariable ["blck_ActiveMissionCoords",[]]);
};
// Check for near Bases
if(_validspot) then {
if (blck_modType isEqualTo "Epoch") then {
{
if (_position distance _x < 1000) exitwith {
_validspot = false;
};
} foreach (missionnamespace getvariable ["Epoch_PlotPoles",[]]);
}
else {
if (blck_modType isEqualTo "Exile") then {
{
if (_position distance _x < blck_minDistanceToBases) exitwith {
_validspot = false;
};
} foreach (nearestObjects [blck_mapCenter, ["Exile_Construction_Flag_Static"], blck_mapRange + 25000]);
};
};
};
// Check for near Players
if(_validspot) then {
{
if (_position distance _x < blck_minDistanceToPlayer) exitwith {
_validspot = false;
};
} foreach allplayers;
};
// Check for near locations
if (_validspot) then {
{
if (_position distance (_x select 0) < (_x select 1)) exitWith {
_validspot = false;
};
} forEach blck_locationBlackList;
};
// Check for DMS missions
if (blck_minDistanceFromDMS > 0 && _validspot) then
{
{
if (_position distance _x < blck_minDistanceFromDMS) exitWith {
_validspot = false;
};
} forEach ([] call blck_fnc_getAllDMSMarkers);
};
};
_position set [2, 0];
_position

View File

@ -31,7 +31,10 @@ if (count _readyToSpawnQue > 0) then
_coords = [] call blck_fnc_FindSafePosn;
if (_coords isEqualTo []) exitWith
{
diag_log format["[blckagls] fnc_spawnPendingMissions: <ERROR> _fnc_findSafePosn could not find a location for this mission; consider reducing distances between players, bases, missions or towns."];
};
_compiledMission = selectRandom (_missionToSpawn select 0);
_missionMarker = _missionToSpawn select 1;

View File

@ -17,6 +17,7 @@ private _functions = [
["blck_fnc_waitTimer","\q\addons\custom_server\Compiles\Functions\GMS_fnc_waitTimer.sqf"],
["blck_fnc_timedOut","\q\addons\custom_server\Compiles\Functions\GMS_fnc_timedOut.sqf"],
["blck_fnc_FindSafePosn","\q\addons\custom_server\Compiles\Functions\GMS_fnc_findSafePosn.sqf"],
["blck_fnc_findSafePosn_2","\q\addons\custom_server\Compiles\Functions\GMS_fnc_findSafePosn_2.sqf"],
["blck_fnc_randomPosition","\q\addons\custom_server\Compiles\Functions\GMS_fnc_randomPosn.sqf"], // find a randomPosn. see script for details.
["blck_fnc_findPositionsAlongARadius","\q\addons\custom_server\Compiles\Functions\GMS_fnc_findPositionsAlongARadius.sqf"],
["blck_fnc_giveTakeCrypto","\q\addons\custom_server\Compiles\Functions\GMS_fnc_giveTakeCrypto.sqf"],

View File

@ -166,6 +166,9 @@ private _other = ["NameLocal"] call _fn_setupLocationType;
private _airport = ["Airport"] call _fn_setupLocationType;
blck_townLocations = _villages + _cites + _capitals + _marine + _other + _airport;
{
blck_locationBlackList pushBack [locationPosition _x, blck_minDistanceFromTowns];
} forEach blck_townLocations;
diag_log format["_init_server: count blck_townLocations = %1 || blck_townLocations = %2",count blck_townLocations, blck_townLocations];
//Start the mission timers
@ -228,4 +231,38 @@ blck_pvs_version = blck_versionNumber;
publicVariable "blck_pvs_version";
diag_log format["[blckeagls] version %1 Build %2 Date %4 Loaded in %3 seconds",blck_versionNumber,blck_buildNumber,diag_tickTime - _blck_loadingStartTime,blck_buildDate]; //,blck_modType];
/*
if (blck_debugOn || (blck_debugLevel >= 1)) then
{
private _pos = [] call blck_fnc_findSafePosn;
private _root = "";
private _path = "Orange";
private _mission = "officeComplex"; //"bunkerMission";
private _compiledMission = compilefinal preprocessFileLineNumbers format["\q\addons\custom_server\Missions\%1\%2.sqf",_path,_mission];
diag_log format["[blckeagls] mission test sequence run for mission path %1 name %2",_path,_mission];
[_pos,"testMarkerGRG","blue"] spawn _compiledMission;
diag_log format["testmarker mission spawned at %1",diag_tickTime];
{
diag_log format["<GRG-TEST.Here are some settings: %1 = %2", ['blck_MinDistanceFromMission','blck_minDistanceToBases','blck_minDistanceToPlayer','blck_minDistanceFromTowns'] select _forEachIndex,_x];
} forEach [blck_MinDistanceFromMission,blck_minDistanceToBases,blck_minDistanceToPlayer,blck_minDistanceFromTowns];
};
*/
if (blck_debugOn) then
{
diag_log "blck_init_server: <BEGIN> findSafePosn speed tests";
private _allCoords = [];
private _t1 = diag_tickTime;
for "_i" from 1 to 25 do
{
private _coords = [] call blck_fnc_FindSafePosn;
};
diag_log format["blck_init_server: time elapsed for 10000 calls to blck_fnc_findSafePosn = %1",diag_tickTime - _t1];
_t1 = diag_tickTime;
_allCoords = [];
for "_j" from 1 to 25 do
{
private _coords = [] call blck_fnc_FindSafePosn_2;
};
diag_log format["blck_init_server: time elapsed for 10000 calls to blck_fnc_findSafePosn_2 = %1",diag_tickTime - _t1];
};