123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- /*
- File: fn_findSpace.sqf
- Author: Rarek [AW]
- Description
- | A simple way to find empty space using a series of parameters.
- | Designed for Side Mission / Priority Target creators who wish
- | to easily find space without having to faff around with findSafePos,
- | randomPos and isFlatEmpty.
- |
- | As a way to force the I&A 3 design, developers using this function
- | cannot search for a position within a specific area and must instead
- | search across the entirety of the game map.
- |____________________
- Parameters
- | 0 - Area (String)
- | REQUIRED
- | // treat this as "must be in/on X"
- | - "water" // ignores "must be flat" bool
- | - "shore"
- | - "land"
- | - "civilisation"
- | - "anywhere"
- | - "main"
- | 1 - Must be flat? (Bool|Optional)
- | Default FALSE
- | // essential for artillery pieces etc
- | 2 - Empty space needed radius (Object OR Integer OR classname|Optional)
- | Default 1
- | // If object, gets size and finds relevant empty space
- | // Otherwise, it'll just find an empty space with the
- | // radius given.
- | // Useful for spawning large buildings when size is unknown
- |____________________
- Returns
- | Single position in format [x,y,z] (Array)
- |____________________
- Examples
- | _pos = ["inland", TRUE, "O_Mortar_className_F"] call AW_fnc_findSpace;
- | _pos = ["water"] call AW_fnc_findSpace;
- | _pos = ["anywhere", FALSE, 50] call AW_fnc_findSpace;
- |____________________
- */
- private ["_this", "_area", "_gradient", "_radius"];
- _area = [_this,0,"land",[""]] call BIS_fnc_param;
- _gradient = [_this,1,2000,[true]] call BIS_fnc_param;
- if (typeName _gradient == "BOOL" && _gradient) then { _gradient = 0.3; };
- _radius = [_this,2,1,[objNull,[]]] call BIS_fnc_param;
- if (typeName _radius == "OBJECT") then { _radius = getPos _radius; };
- _pos = [];
- _validPos = false;
- while {!_validPos} do
- {
- _validPos = true;
- switch (_area) do
- {
- case "water": { _pos = [[], 0, -1, _radius, 2, 2000, 0] call BIS_fnc_findSafePos; };
- case "shore": { _pos = [[], 0, -1, _radius, 1, _gradient, 1] call BIS_fnc_findSafePos; };
- case "land": { _pos = [[], 0, -1, _radius, 0, _gradient, 0] call BIS_fnc_findSafePos; };
- case "civilisation": { /* to be created :D */ };
- case "anywhere": { _pos = [[], 0, -1, _radius, 1, _gradient, 0] call BIS_fnc_findSafePos; };
- case "main":
- {
- _mainPos = [];
- { if (["main_", _x] call BIS_fnc_inString) exitWith { _mainPos = markerPos _x; }; } forEach allMapMarkers;
- _pos = [_mainPos, 0, 500, _radius, 0, _gradient, 0] call BIS_fnc_findSafePos;
- };
- case "poi": { _pos = markerPos (pointsOfInterest call BIS_fnc_selectRandom); };
- default {};
- };
- {
- if ((_x distance _pos) < 1000) exitWith { _validPos = false; };
- } forEach playableUnits;
- };
- _pos
|