diff --git a/addons/ai/CfgWaypoints.hpp b/addons/ai/CfgWaypoints.hpp new file mode 100644 index 000000000..3e5043f2d --- /dev/null +++ b/addons/ai/CfgWaypoints.hpp @@ -0,0 +1,11 @@ + +class CfgWaypoints { + class A3 { // called "Advanced" + class CBA_Task_Garrison { + displayName = "GARRISON"; // all caps + displayNameDebug = "CBA_Task_Garrison"; + file = QPATHTOF(fnc_waypointGarrison.sqf); + icon = "\a3\3DEN\Data\CfgWaypoints\GetInNearest_ca.paa"; + }; + }; +}; diff --git a/addons/ai/config.cpp b/addons/ai/config.cpp index bb275658d..97e5fa1c1 100644 --- a/addons/ai/config.cpp +++ b/addons/ai/config.cpp @@ -14,3 +14,4 @@ class CfgPatches { }; #include "CfgFunctions.hpp" +#include "CfgWaypoints.hpp" diff --git a/addons/ai/fnc_waypointGarrison.sqf b/addons/ai/fnc_waypointGarrison.sqf new file mode 100644 index 000000000..bdc3e21ba --- /dev/null +++ b/addons/ai/fnc_waypointGarrison.sqf @@ -0,0 +1,60 @@ +/* ---------------------------------------------------------------------------- +Function: CBA_fnc_waypointGarrison + +Description: + Scripted waypoint that makes group garrision nearby buildings and static weapons. + +Parameters: + 0: Group + 1: Waypoint position + +Returns: + true + +Author: + commy2 +---------------------------------------------------------------------------- */ +#include "script_component.hpp" + +#define POP_RAND(array) (array deleteAt floor random count array) + +params ["_group", "_position"]; + +// leader should not issue attack orders +_group enableAttack false; + +private _staticWeapons = _position nearObjects ["StaticWeapon", 50] select {_x emptyPositions "gunner" > 0}; +private _buildings = (_position nearObjects ["Building", 50]) apply {_x buildingPos -1} select {count _x > 0}; + +{ + if (count _staticWeapons > 0 && {random 1 < 0.31}) then { + _x assignAsGunner (_staticWeapons deleteAt 0); + [_x] orderGetIn true; + } else { + if (count _buildings > 0 && {random 1 < 0.93}) then { + private _building = selectRandom _buildings; + private _position = POP_RAND(_building); + + // if building positions are all taken, remove from possible buildings + if (_building isEqualTo []) then { + _buildings = _buildings select {count _x > 0}; + }; + + // prevent units from crouching or going prone + _x setUnitPos "UP"; + + // doMoveAndStay + [_x, _position] spawn { + params ["_unit", "_position"]; + + _unit doMove _position; + waitUntil {unitReady _unit}; + doStop _unit; + }; + } else { + _x doMove _position; + }; + }; +} forEach units _group; + +true