forge/arma/server/addons/task/functions/objects/fnc_HVTEntityController.sqf
2026-06-03 17:36:13 -05:00

80 lines
2.6 KiB
Plaintext

#include "..\script_component.hpp"
/*
* Object-style HVT entity controller.
*/
#pragma hemtt ignore_variables ["_self"]
GVAR(HVTEntityController) = +GVAR(EntityControllerBaseClass);
GVAR(HVTEntityController) merge [createHashMapFromArray [
["#type", "HVTEntityController"],
["#create", compileFinal {
params [
["_taskID", "", [""]],
["_entity", objNull, [objNull]],
["_controllerParams", createHashMap, [createHashMap]]
];
_self call ["initializeControllerState", [_taskID, _entity, "hvt", _controllerParams]];
_self set ["captureRadius", _controllerParams getOrDefault ["captureRadius", 2]];
_self call ["registerInstance", []];
}],
["#delete", compileFinal {
_self call ["unregisterInstance", []];
}],
["findNearbyCapturer", compileFinal {
private _entity = _self getOrDefault ["entity", objNull];
if (isNull _entity || { !alive _entity }) exitWith { objNull };
private _radius = _self getOrDefault ["captureRadius", 2];
private _nearPlayers = allPlayers inAreaArray [ASLToAGL getPosASL _entity, _radius, _radius, 0, false, 2];
if (_nearPlayers isEqualTo []) exitWith { objNull };
_nearPlayers select 0
}],
["transitionToCaptured", compileFinal {
private _entity = _self getOrDefault ["entity", objNull];
if (isNull _entity || { !alive _entity }) exitWith { false };
_entity setCaptive true;
_entity enableAIFeature ["MOVE", true];
true
}],
["runLoop", compileFinal {
if !(_self call ["registerTaskEntity", ["hvts"]]) exitWith {
_self call ["markAborted", []];
_self call ["cleanup", []];
false
};
_self call ["markActive", []];
private _capturer = objNull;
waitUntil {
sleep 1;
if !(_self call ["isAssignedTaskOpen", []]) exitWith { true };
if !(_self call ["isEntityUsable", []]) exitWith { true };
_capturer = _self call ["findNearbyCapturer", []];
!isNull _capturer
};
if !(_self call ["isAssignedTaskOpen", []]) exitWith {
_self call ["markAborted", []];
_self call ["cleanup", []];
false
};
if !(_self call ["isEntityUsable", []]) exitWith {
_self call ["markAborted", []];
_self call ["cleanup", []];
false
};
_self call ["transitionToCaptured", []];
_self call ["markFinished", []];
_self call ["cleanup", []];
true
}]
], true];