123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- /*
- File: fn_setBehaviour.sqf
- Author: Rarek [AW]
- Description
- | Sets behaviour of the given array of groups / units according
- | to a set of passed parameters.
- |
- | Behaviours are currently limited to 4 "types" which can be
- | customised in regards to their positioning and radius.
- |____________________
- Parameters
- | 0 - Units / groups to be controlled
- | - REQUIRED
- | - TYPE: Array
- | - DEFAULT: None
- |
- | 1 - Behaviours to perform
- | - REQUIRED
- | - TYPE: Array
- | - DEFAULT: None
- |____________________
- Example
- | _enemies = ["O_soldier_F", group player, ["More", "Soldiers", "Here"]];
- | _behaviours = [["defend", _pos, _radius], ["patrol", _pos, _radius]];
- | [_enemies, _behaviours] call AW_fnc_setBehaviour;
- |____________________
- */
- private["_obj", "_behaviours", "_type", "_x", "_behaviour", "_order", "_pos", "_radius", "_near", "_leader", "_group", "_dir", "_retreatPos", "_waypoint"];
- _obj = [_this,0,[],[[],objNull,grpNull]] call BIS_fnc_param;
- if (typeName _obj == "OBJECT") then { _obj = [group _obj]; };
- if (typeName _obj == "GROUP") then { _obj = [_obj]; };
- _behaviours = [_this,1,[["patrol", true, 100]],[[]]] call BIS_fnc_param;
- {
- _type = typeName _x;
- switch (_type) do
- {
- case "ARRAY": { [_x, _behaviours] call AW_fnc_setBehaviour; };
- default
- {
- _behaviour = _behaviours call BIS_fnc_selectRandom;
- _order = [_behaviour,0,"patrol",[""]] call BIS_fnc_param;
- _pos = [_behaviour,1,[0,0,0],[[],"",true],[2,3]] call BIS_fnc_param;
- if (typeName _pos == "BOOL") then
- {
- if (_type == "GROUP") then { _pos = getPos (leader _x); };
- if (_type == "OBJECT") then { _pos = getPos _x; };
- };
- if (typeName _pos == "STRING") then
- {
- _pos = [_pos, ((markerSize _pos) call BIS_fnc_lowestNum)] call AW_fnc_randomPosTrigger;
- };
- _radius = [_behaviour,2,100,[0]] call BIS_fnc_param;
- switch (_order) do
- {
- case "defend":
- {
- _group = if (_type == "GROUP") then { _x } else { group _x };
- _near = [[[_pos, _radius]], ["water", "out"]] call BIS_fnc_randomPos;
- [_group, _near] call BIS_fnc_taskDefend;
- };
- case "active_defend":
- {
- _group = if (_type == "GROUP") then { _x } else { group _x };
- _near = [[[_pos, _radius]], ["water", "out"]] call BIS_fnc_randomPos;
- [_group, _near] call BIS_fnc_taskDefend;
- _x setBehaviour "AWARE";
- _x setSpeedMode "FULL";
- };
- case "patrol":
- {
- _group = if (_type == "GROUP") then { _x } else { group _x };
- _didWork = false;
- _attempt_limit = 10;
- _attempts = 0;
- while { !_didWork && _attempts < _attempt_limit } do
- {
- _attempts = _attempts + 1;
- _didWork = [_group, _pos, _radius] call BIS_fnc_taskPatrol;
- diag_log format["::::AW:::: _x = %1 :::: _pos = %2 :::: _radius = %3 :::: _didWork = %4", _x, _pos, _radius, _didWork];
- };
- if (!_didWork) then
- {
- _x setFormation "DIAMOND";
- };
- };
- case "attack": { [_x, _pos] call BIS_fnc_taskAttack; };
- case "retreat":
- {
- _leader = if (_type == "GROUP") then { leader _x } else { _x };
- _group = if (_type == "GROUP") then { _x } else { group _x };
- _dir = [_pos, getPos _leader] call BIS_fnc_dirTo;
- _retreatPos = [];
- while {true} do
- {
- _retreatPos = [_pos, _radius, _dir] call BIS_fnc_relPos;
- if (!(surfaceIsWater [(_retreatPos select 0), (_retreatPos select 1)])) exitWith {};
- _dir = if ((_dir + 45) > 359) then { 0 } else { (_dir + 45) };
- };
- _waypoint = _group addWaypoint [_retreatPos, 0];
- _waypoint setWaypointType "MOVE";
- _waypoint setWaypointBehaviour "AWARE";
- _waypoint setWaypointCombatMode "GREEN";
- _waypoint setWaypointSpeed "FULL";
- _group setCurrentWaypoint _waypoint;
- };
- };
- };
- };
- } forEach _obj;
|