89 lines
3.3 KiB
Plaintext
89 lines
3.3 KiB
Plaintext
#include "..\script_component.hpp"
|
|
|
|
/*
|
|
* Object-style delivery cargo entity controller.
|
|
*/
|
|
|
|
#pragma hemtt ignore_variables ["_self"]
|
|
GVAR(CargoEntityController) = +GVAR(EntityControllerBaseClass);
|
|
GVAR(CargoEntityController) merge [createHashMapFromArray [
|
|
["#type", "CargoEntityController"],
|
|
["#create", compileFinal {
|
|
params [
|
|
["_taskID", "", [""]],
|
|
["_entity", objNull, [objNull]],
|
|
["_controllerParams", createHashMap, [createHashMap]]
|
|
];
|
|
|
|
_self call ["initializeControllerState", [_taskID, _entity, "cargo", _controllerParams]];
|
|
_self set ["damageThreshold", _controllerParams getOrDefault ["damageThreshold", 0.7]];
|
|
_self set ["damageEventId", -1];
|
|
_self call ["registerInstance", []];
|
|
}],
|
|
["#delete", compileFinal {
|
|
_self call ["cleanup", []];
|
|
}],
|
|
["watchDamage", compileFinal {
|
|
private _entity = _self getOrDefault ["entity", objNull];
|
|
if (isNull _entity) exitWith { false };
|
|
|
|
private _threshold = _self getOrDefault ["damageThreshold", 0.7];
|
|
_entity setVariable [QGVAR(cargoDamageThreshold), _threshold];
|
|
|
|
private _eventId = _entity addEventHandler ["Dammaged", {
|
|
params ["_unit"];
|
|
|
|
private _threshold = _unit getVariable [QGVAR(cargoDamageThreshold), 0.7];
|
|
if (damage _unit < _threshold) exitWith {};
|
|
|
|
private _taskID = _unit getVariable ["assignedTask", _unit getVariable [QGVAR(assignedTask), ""]];
|
|
if (_taskID isEqualTo "") exitWith {};
|
|
private _taskStatus = GVAR(TaskStore) call ["getTaskStatus", [_taskID]];
|
|
if (GVAR(TaskStore) call ["isTerminalStatus", [_taskStatus]]) exitWith {};
|
|
if (_unit getVariable [QGVAR(cargoDamageWarned), false]) exitWith {};
|
|
|
|
_unit setVariable [QGVAR(cargoDamageWarned), true];
|
|
GVAR(TaskStore) call ["notifyParticipants", [_taskID, "warning", "Tasks", format ["Cargo for task %1 has been severely damaged.", _taskID]]];
|
|
}];
|
|
|
|
_self set ["damageEventId", _eventId];
|
|
true
|
|
}],
|
|
["cleanup", compileFinal {
|
|
private _entity = _self getOrDefault ["entity", objNull];
|
|
private _eventId = _self getOrDefault ["damageEventId", -1];
|
|
|
|
if (!isNull _entity && { _eventId >= 0 }) then {
|
|
_entity removeEventHandler ["Dammaged", _eventId];
|
|
};
|
|
|
|
_self call ["unregisterInstance", []]
|
|
}],
|
|
["runLoop", compileFinal {
|
|
if !(_self call ["registerTaskEntity", ["cargo"]]) exitWith {
|
|
_self call ["markAborted", []];
|
|
_self call ["cleanup", []];
|
|
false
|
|
};
|
|
|
|
_self call ["watchDamage", []];
|
|
_self call ["markActive", []];
|
|
|
|
waitUntil {
|
|
sleep 1;
|
|
private _entity = _self getOrDefault ["entity", objNull];
|
|
!(_self call ["isAssignedTaskOpen", []]) || { isNull _entity } || { !alive _entity } || { damage _entity >= (_self getOrDefault ["damageThreshold", 0.7]) }
|
|
};
|
|
|
|
if !(_self call ["isAssignedTaskOpen", []]) exitWith {
|
|
_self call ["markAborted", []];
|
|
_self call ["cleanup", []];
|
|
false
|
|
};
|
|
|
|
_self call ["markFinished", []];
|
|
_self call ["cleanup", []];
|
|
true
|
|
}]
|
|
], true];
|