ACE3/TO_MERGE/agm/Medical/functions/fn_aiTreat.sqf

123 lines
3.3 KiB
Plaintext

// by commy2
private ["_medic", "_patient", "_task"];
_medic = _this select 0;
_patient = _this select 1;
_task = _this select 2;
// exit if the unit already has a task
if (!scriptDone (_medic getVariable ["AGM_Medical_AITask", scriptNull])) exitWith {};//systemChat str _this;//
// exit if the medic can't do te treatment
if !(_this call AGM_Medical_fnc_aiCanTreat) exitWith {
// continue walking freely
_medic doMove getPosASL _medic
};
// do treatment
private "_scriptHandle";
_scriptHandle = _this spawn {
_medic = _this select 0;
_patient = _this select 1;
_task = _this select 2;
// wait until ready again
waitUntil {
// exit if dead
if (!alive _medic || {!alive _patient} || {_medic getVariable ["AGM_isUnconscious", false]}) exitWith {true};
sleep 0.15;
_medic getVariable ["AGM_canTreat", true]
};
// wait until medic next to patient
if (_medic distanceSqr _patient > 4) then {
_doMoveLoop = _this spawn {
while {true} do {
(_this select 0) doMove getPosASL (_this select 1);
sleep 30;
};
};
waitUntil {
// exit if dead
if (!alive _medic || {!alive _patient} || {_medic getVariable ["AGM_isUnconscious", false]}) exitWith {true};
sleep 0.15;
getPosASL _medic distanceSqr getPosASL _patient < 5
};
terminate _doMoveLoop;
};
// exit if the medic can't do te treatment
if !(_this call AGM_Medical_fnc_aiCanTreat) exitWith {
// continue walking freely
_medic doMove getPosASL _medic
};
// halt
doStop _medic;
// treat everything
_items = items _medic;
switch (_task) do {
case ("bandage"): {
if (damage _patient > 0 && {"AGM_Bandage" in _items}) then {
[_medic, _patient, "bandage", "All"] call AGM_Medical_fnc_treat;
};
};
case ("morphine"): {
if (_patient getVariable ["AGM_Pain", 0] > 0 && {"AGM_Morphine" in _items}) then {
[_medic, _patient, "morphine"] call AGM_Medical_fnc_treat;
};
};
case ("epipen"): {
if (_patient getVariable ["AGM_isUnconscious", false] && {"AGM_Epipen" in _items}) then {
[_medic, _patient, "epipen"] call AGM_Medical_fnc_treat;
};
};
case ("bloodbag"): {
if (_patient getVariable ["AGM_Blood", 1] < 1 && {"AGM_Bloodbag" in _items}) then {
[_medic, _patient, "bloodbag"] call AGM_Medical_fnc_treat;
};
};
};
// wait until ready again
waitUntil {
// exit if dead
if (!alive _medic || {!alive _patient} || {_medic getVariable ["AGM_isUnconscious", false]}) exitWith {true};
sleep 0.15;
_medic getVariable ["AGM_canTreat", true]
};
// check for next task on this patient
if (damage _patient > 0) exitWith {
[_medic, _patient, "bandage"] spawn AGM_Medical_fnc_aiTreat;
};
if (_patient getVariable ["AGM_Pain", 0] > 0) exitWith {
[_medic, _patient, "morphine"] spawn AGM_Medical_fnc_aiTreat;
};
if (_patient getVariable ["AGM_isUnconscious", false]) exitWith {
[_medic, _patient, "epipen"] spawn AGM_Medical_fnc_aiTreat;
};
if (_patient getVariable ["AGM_Blood", 1] < 1) exitWith {
[_medic, _patient, "bloodbag"] spawn AGM_Medical_fnc_aiTreat;
};
// otherwise continue walking freely
_medic doMove getPosASL _medic;
};
_medic setVariable ["AGM_Medical_AITask", _scriptHandle];