mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Add curator garrison path drawing, clean up garrison code (#6643)
This commit is contained in:
parent
95fbdbce65
commit
6f6b0d15f8
@ -16,3 +16,9 @@ class Extended_PostInit_EventHandlers {
|
|||||||
init = QUOTE(call COMPILE_FILE(XEH_postInit));
|
init = QUOTE(call COMPILE_FILE(XEH_postInit));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Extended_DisplayLoad_EventHandlers {
|
||||||
|
class RscDisplayCurator {
|
||||||
|
ADDON = QUOTE(call FUNC(drawCuratorGarrisonPathing));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
PREP(drawCuratorGarrisonPathing);
|
||||||
PREP(garrison);
|
PREP(garrison);
|
||||||
PREP(unGarrison);
|
PREP(unGarrison);
|
||||||
PREP(garrisonMove);
|
PREP(garrisonMove);
|
||||||
|
@ -22,8 +22,8 @@
|
|||||||
params ["_unitsArray"];
|
params ["_unitsArray"];
|
||||||
{
|
{
|
||||||
_x params ["_unit", "_pos"];
|
_x params ["_unit", "_pos"];
|
||||||
_unit setDestination [_pos, "LEADER PLANNED", true];
|
|
||||||
_unit doMove _pos;
|
_unit doMove _pos;
|
||||||
|
_unit setDestination [_pos, "LEADER PLANNED", true];
|
||||||
LOG_3("%1 doMove %2 | ID: %3",_unit,_pos,clientOwner);
|
LOG_3("%1 doMove %2 | ID: %3",_unit,_pos,clientOwner);
|
||||||
} forEach _unitsArray;
|
} forEach _unitsArray;
|
||||||
}] call CBA_fnc_addEventHandler;
|
}] call CBA_fnc_addEventHandler;
|
||||||
@ -68,42 +68,3 @@
|
|||||||
params ["_unit", "_mode"];
|
params ["_unit", "_mode"];
|
||||||
_unit enableGunLights _mode;
|
_unit enableGunLights _mode;
|
||||||
}] call CBA_fnc_addEventHandler;
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
#ifdef DEBUG_MODE_FULL
|
|
||||||
addMissionEventHandler ["Draw3D", {
|
|
||||||
private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
|
|
||||||
{
|
|
||||||
_x params ["_unit", "_pos"];
|
|
||||||
|
|
||||||
switch (true) do {
|
|
||||||
case (surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : {
|
|
||||||
for "_i" from 0 to 3 do {
|
|
||||||
drawLine3D [_unit modelToWorldVisualWorld [0,0,1], (AGLtoASL _pos), [1,0,0,1]];
|
|
||||||
};
|
|
||||||
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75];
|
|
||||||
};
|
|
||||||
|
|
||||||
case (!surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : {
|
|
||||||
for "_i" from 0 to 3 do {
|
|
||||||
drawLine3D [_unit modelToWorldVisual [0,0,1], _pos, [1,0,0,1]];
|
|
||||||
};
|
|
||||||
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75];
|
|
||||||
};
|
|
||||||
|
|
||||||
case (!surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : {
|
|
||||||
for "_i" from 0 to 3 do {
|
|
||||||
drawLine3D [_unit modelToWorldVisual [0,0,1], (AGLToASL _pos), [1,0,0,1]];
|
|
||||||
};
|
|
||||||
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75];
|
|
||||||
};
|
|
||||||
|
|
||||||
case (surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : {
|
|
||||||
for "_i" from 0 to 3 do {
|
|
||||||
drawLine3D [_unit modelToWorldVisualWorld [0,0,1], _pos, [1,0,0,1]];
|
|
||||||
};
|
|
||||||
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
} forEach _unitMoveList;
|
|
||||||
}];
|
|
||||||
#endif
|
|
||||||
|
54
addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf
Normal file
54
addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#include "script_component.hpp"
|
||||||
|
/*
|
||||||
|
* Author: alganthe
|
||||||
|
* Add draw3D eh to the curator interface.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
|
||||||
|
addMissionEventHandler ["Draw3D", {
|
||||||
|
if (findDisplay 312 isEqualTo displayNull) exitWith {
|
||||||
|
removeMissionEventHandler ["Draw3D", _thisEventHandler];
|
||||||
|
};
|
||||||
|
|
||||||
|
private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
|
||||||
|
{
|
||||||
|
_x params ["_unit", "_pos"];
|
||||||
|
|
||||||
|
switch (true) do {
|
||||||
|
case (surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : {
|
||||||
|
for "_i" from 0 to 3 do {
|
||||||
|
drawLine3D [_unit modelToWorldVisualWorld [0,0,1], (AGLtoASL _pos), [1,0,0,1]];
|
||||||
|
};
|
||||||
|
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75];
|
||||||
|
};
|
||||||
|
|
||||||
|
case (!surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : {
|
||||||
|
for "_i" from 0 to 3 do {
|
||||||
|
drawLine3D [_unit modelToWorldVisual [0,0,1], _pos, [1,0,0,1]];
|
||||||
|
};
|
||||||
|
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75];
|
||||||
|
};
|
||||||
|
|
||||||
|
case (!surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : {
|
||||||
|
for "_i" from 0 to 3 do {
|
||||||
|
drawLine3D [_unit modelToWorldVisual [0,0,1], (AGLToASL _pos), [1,0,0,1]];
|
||||||
|
};
|
||||||
|
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75];
|
||||||
|
};
|
||||||
|
|
||||||
|
case (surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : {
|
||||||
|
for "_i" from 0 to 3 do {
|
||||||
|
drawLine3D [_unit modelToWorldVisualWorld [0,0,1], _pos, [1,0,0,1]];
|
||||||
|
};
|
||||||
|
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} forEach _unitMoveList;
|
||||||
|
}];
|
@ -79,11 +79,9 @@ if (_topDownFilling) then {
|
|||||||
|
|
||||||
//Remove positions units are already pathing to
|
//Remove positions units are already pathing to
|
||||||
_buildingsIndex = _buildingsIndex apply {
|
_buildingsIndex = _buildingsIndex apply {
|
||||||
private _testedBuilding = _x;
|
_x select {
|
||||||
|
|
||||||
_testedBuilding select {
|
|
||||||
private _testedPos = _x;
|
private _testedPos = _x;
|
||||||
(({(_x select 1) isEqualTo _testedPos} count (missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []])) == 0)
|
({(_x select 1) isEqualTo _testedPos} count (missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []])) == 0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -53,6 +53,37 @@ if (isNil QGVAR(garrison_moveUnitPFH)) then {
|
|||||||
{
|
{
|
||||||
_x params ["_unit", "_pos"];
|
_x params ["_unit", "_pos"];
|
||||||
|
|
||||||
|
private _fnc_attemptFailed = {
|
||||||
|
if (_failSafeRemainingAttemps == 0 ) then {
|
||||||
|
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
|
||||||
|
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
|
||||||
|
[QGVAR(unGarrison), [[_unit]], _unit] call CBA_fnc_targetEvent;
|
||||||
|
_unitMoveList deleteAt (_unitMoveList find _x);
|
||||||
|
LOG("garrisonMove PFH: all moving commands failed | restoring AI capabilities");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_unit setVariable [QGVAR(garrisonMove_failSafe), [_failSafeTimer + 15, _failSafeRemainingAttemps - 1]];
|
||||||
|
[QGVAR(doMove), [[[_unit, _pos]]], _unit] call CBA_fnc_targetEvent;
|
||||||
|
LOG("garrisonMove PFH unitReady: unit not close enough | Sending another doMove command");
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
private _fnc_attemptSuccessful = {
|
||||||
|
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
|
||||||
|
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
|
||||||
|
_unit setVariable [QGVAR(garrisonned), true, true];
|
||||||
|
_unitMoveList deleteAt (_unitMoveList find _x);
|
||||||
|
|
||||||
|
[QGVAR(AISection), [[_unit], ["PATH"], false], _unit] call CBA_fnc_targetEvent;
|
||||||
|
[QGVAR(AISection), [[_unit], ["FSM"], true], _unit] call CBA_fnc_targetEvent;
|
||||||
|
|
||||||
|
if ({(_x select 0) in units _unit && {!isPlayer (_x select 0)}} count _unitMoveList == 0) then {
|
||||||
|
[QGVAR(enableAttack), [[_unit], true], _unit] call CBA_fnc_targetEvent;
|
||||||
|
};
|
||||||
|
|
||||||
|
LOG(format [ARR_2("garrisonMove PFH: unit in position | %1 units left", count _unitMoveList)]);
|
||||||
|
};
|
||||||
|
|
||||||
// Check if unit is alive or even existing
|
// Check if unit is alive or even existing
|
||||||
if (!alive _unit) then {
|
if (!alive _unit) then {
|
||||||
_unitMoveList deleteAt (_unitMoveList find _x);
|
_unitMoveList deleteAt (_unitMoveList find _x);
|
||||||
@ -69,37 +100,14 @@ if (isNil QGVAR(garrison_moveUnitPFH)) then {
|
|||||||
if (unitReady _unit) then {
|
if (unitReady _unit) then {
|
||||||
// Check for distance, doMove and AI are moody and may stop for no reason, within 6 meters and ready should be fine
|
// Check for distance, doMove and AI are moody and may stop for no reason, within 6 meters and ready should be fine
|
||||||
if (_unitPos distance _pos < 3) then {
|
if (_unitPos distance _pos < 3) then {
|
||||||
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
|
call _fnc_attemptSuccessful;
|
||||||
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
|
|
||||||
_unit setVariable [QGVAR(garrisonned), true, true];
|
|
||||||
_unitMoveList deleteAt (_unitMoveList find _x);
|
|
||||||
|
|
||||||
[QGVAR(AISection), [[_unit], ["PATH"], false], _unit] call CBA_fnc_targetEvent;
|
|
||||||
[QGVAR(AISection), [[_unit], ["FSM"], true], _unit] call CBA_fnc_targetEvent;
|
|
||||||
|
|
||||||
if ({(_x select 0) in units _unit && {!isPlayer (_x select 0)}} count _unitMoveList == 0) then {
|
|
||||||
[QGVAR(enableAttack), [[_unit], true], _unit] call CBA_fnc_targetEvent;
|
|
||||||
};
|
|
||||||
|
|
||||||
LOG(format [ARR_2("garrisonMove PFH: unit in position | %1 units left", count _unitMoveList)]);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Tell the unit to move if an order wasn't given within 30s, avoid doMove spam
|
// Tell the unit to move if an order wasn't given within 30s, avoid doMove spam
|
||||||
(_unit getVariable [QGVAR(garrisonMove_failSafe), [CBA_missionTime, 5]]) params ["_failSafeTimer", "_failSafeRemainingAttemps"];
|
(_unit getVariable [QGVAR(garrisonMove_failSafe), [CBA_missionTime, 5]]) params ["_failSafeTimer", "_failSafeRemainingAttemps"];
|
||||||
|
|
||||||
if (_failSafeTimer <= CBA_missionTime) then {
|
if (_failSafeTimer <= CBA_missionTime) then {
|
||||||
if (_failSafeRemainingAttemps == 0 ) then {
|
call _fnc_attemptFailed;
|
||||||
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
|
|
||||||
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
|
|
||||||
[QGVAR(unGarrison), [[_unit]], _unit] call CBA_fnc_targetEvent;
|
|
||||||
_unitMoveList deleteAt (_unitMoveList find _x);
|
|
||||||
LOG("garrisonMove PFH unitReady: all moving commands failed | restoring AI capabilities");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
_unit setVariable [QGVAR(garrisonMove_failSafe), [_failSafeTimer + 15, _failSafeRemainingAttemps - 1]];
|
|
||||||
[QGVAR(doMove), [[[_unit, _pos]]], _unit] call CBA_fnc_targetEvent;
|
|
||||||
LOG("garrisonMove PFH unitReady: unit not close enough | Sending another doMove command");
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
@ -107,30 +115,12 @@ if (isNil QGVAR(garrison_moveUnitPFH)) then {
|
|||||||
|
|
||||||
// AI may sometimes not be able to report unitReady, this is to avoid the PFH running forever
|
// AI may sometimes not be able to report unitReady, this is to avoid the PFH running forever
|
||||||
switch true do {
|
switch true do {
|
||||||
case ((_unitPosTimer + 15) < CBA_missionTime && {(_unitPos distance _pos) < 3}) : {
|
case ((_unitPos distance _pos) < 3) : {
|
||||||
TRACE_1("case 1",_unit);
|
call _fnc_attemptSuccessful;
|
||||||
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
|
|
||||||
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
|
|
||||||
_unit setVariable [QGVAR(garrisonned), true, true];
|
|
||||||
_unitMoveList deleteAt (_unitMoveList find _x);
|
|
||||||
|
|
||||||
[QGVAR(AISection), [[_unit], ["PATH"], false], _unit] call CBA_fnc_targetEvent;
|
|
||||||
[QGVAR(AISection), [[_unit], ["FSM"], true], _unit] call CBA_fnc_targetEvent;
|
|
||||||
|
|
||||||
if ({(_x select 0) in units _unit && {!isPlayer (_x select 0)}} count _unitMoveList == 0) then {
|
|
||||||
[QGVAR(enableAttack), [[_unit], true], _unit] call CBA_fnc_targetEvent;
|
|
||||||
};
|
|
||||||
|
|
||||||
LOG(format [ARR_2("garrisonMove PFH unitNotReady: unit in position | %1 units left", count _unitMoveList)]);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
case ((_unitPosTimer + 15) < CBA_missionTime && {_unitOldPos distance _unitPos < 0.5}) : {
|
case ((_unitPosTimer + 5) < CBA_missionTime && {_unitOldPos distance _unitPos < 0.5}) : {
|
||||||
TRACE_3("case 2",_unit, ((_unitPosTimer + 15) < CBA_missionTime), (_unitOldPos distance _unitPos < 0.5));
|
call _fnc_attemptFailed;
|
||||||
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
|
|
||||||
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
|
|
||||||
[QGVAR(unGarrison), [[_unit]], _unit] call CBA_fnc_targetEvent;
|
|
||||||
_unitMoveList deleteAt (_unitMoveList find _x);
|
|
||||||
LOG("garrisonMove PFH unitNotReady: all moving commands failed | restoring AI capabilities");
|
|
||||||
};
|
};
|
||||||
|
|
||||||
case (_unitOldPos distance _unitPos < 0.5) : {};
|
case (_unitOldPos distance _unitPos < 0.5) : {};
|
||||||
|
@ -39,17 +39,7 @@ _units = _units select {local _x};
|
|||||||
_x doMove ((nearestBuilding (getPos _x)) buildingExit 0);
|
_x doMove ((nearestBuilding (getPos _x)) buildingExit 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
private _fnc_countGarrisonnedUnits = {
|
if ({(_x getVariable [QGVAR(garrisonned), false]) && !isPlayer _x} count (units _x) == 0) then {
|
||||||
params ["_unit", "_bool"];
|
|
||||||
if (_bool) then {
|
|
||||||
({(_x getVariable [QGVAR(garrisonned), false]) && {!isPlayer _x}} count units _unit)
|
|
||||||
} else {
|
|
||||||
({!(_x getVariable [QGVAR(garrisonned), false]) && {!isPlayer _x}} count units _unit)
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
if ([_x, true] call _fnc_countGarrisonnedUnits == ({!isPlayer _x} count (units _x)) - 1 || {[_x, false] call _fnc_countGarrisonnedUnits == {!isPlayer _x} count (units _x)}) then {
|
|
||||||
LOG("fnc_ungarrison: enableAttack true");
|
LOG("fnc_ungarrison: enableAttack true");
|
||||||
(group _x) enableAttack true;
|
(group _x) enableAttack true;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user